diff --git a/src/main/java/fr/xephi/authme/api/v3/AuthMeApi.java b/src/main/java/fr/xephi/authme/api/v3/AuthMeApi.java index ca133c51..3d8ab194 100644 --- a/src/main/java/fr/xephi/authme/api/v3/AuthMeApi.java +++ b/src/main/java/fr/xephi/authme/api/v3/AuthMeApi.java @@ -21,6 +21,7 @@ import java.time.Instant; import java.util.ArrayList; import java.util.Date; import java.util.List; +import java.util.Locale; import java.util.Optional; /** @@ -217,7 +218,7 @@ public class AuthMeApi { * @return true if player is registered, false otherwise */ public boolean isRegistered(String playerName) { - String player = playerName.toLowerCase(); + String player = playerName.toLowerCase(Locale.ROOT); return dataSource.isAuthAvailable(player); } @@ -241,7 +242,7 @@ public class AuthMeApi { * @return true if the player was registered successfully */ public boolean registerPlayer(String playerName, String password) { - String name = playerName.toLowerCase(); + String name = playerName.toLowerCase(Locale.ROOT); if (isRegistered(name)) { return false; } diff --git a/src/main/java/fr/xephi/authme/command/CommandMapper.java b/src/main/java/fr/xephi/authme/command/CommandMapper.java index b7ed2170..5beb5e33 100644 --- a/src/main/java/fr/xephi/authme/command/CommandMapper.java +++ b/src/main/java/fr/xephi/authme/command/CommandMapper.java @@ -11,6 +11,7 @@ import java.util.ArrayList; import java.util.Collection; import java.util.HashSet; import java.util.List; +import java.util.Locale; import java.util.Set; import static fr.xephi.authme.command.FoundResultStatus.INCORRECT_ARGUMENTS; @@ -130,7 +131,7 @@ public class CommandMapper { } private CommandDescription getBaseCommand(String label) { - String baseLabel = label.toLowerCase(); + String baseLabel = label.toLowerCase(Locale.ROOT); if (baseLabel.startsWith("authme:")) { baseLabel = baseLabel.substring("authme:".length()); } @@ -157,7 +158,7 @@ public class CommandMapper { return null; } - final String label = parts.get(0).toLowerCase(); + final String label = parts.get(0).toLowerCase(Locale.ROOT); final int argumentCount = parts.size() - 1; for (CommandDescription child : baseCommand.getChildren()) { diff --git a/src/main/java/fr/xephi/authme/command/executable/authme/AccountsCommand.java b/src/main/java/fr/xephi/authme/command/executable/authme/AccountsCommand.java index 2a87802e..20f6bff8 100644 --- a/src/main/java/fr/xephi/authme/command/executable/authme/AccountsCommand.java +++ b/src/main/java/fr/xephi/authme/command/executable/authme/AccountsCommand.java @@ -10,6 +10,7 @@ import org.bukkit.command.CommandSender; import javax.inject.Inject; import java.util.List; +import java.util.Locale; /** * Shows all accounts registered by the same IP address for the given player name or IP address. @@ -44,7 +45,7 @@ public class AccountsCommand implements ExecutableCommand { }); } else { bukkitService.runTaskAsynchronously(() -> { - PlayerAuth auth = dataSource.getAuth(playerName.toLowerCase()); + PlayerAuth auth = dataSource.getAuth(playerName.toLowerCase(Locale.ROOT)); if (auth == null) { commonService.send(sender, MessageKey.UNKNOWN_USER); return; 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 fd0a7351..b035b63e 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 @@ -22,6 +22,7 @@ import org.bukkit.command.CommandSender; import javax.inject.Inject; import java.util.List; +import java.util.Locale; import java.util.Map; /** @@ -71,7 +72,7 @@ public class ConverterCommand implements ExecutableCommand { private static Class getConverterClassFromArgs(List arguments) { return arguments.isEmpty() ? null - : CONVERTERS.get(arguments.get(0).toLowerCase()); + : CONVERTERS.get(arguments.get(0).toLowerCase(Locale.ROOT)); } /** diff --git a/src/main/java/fr/xephi/authme/command/executable/authme/PurgeBannedPlayersCommand.java b/src/main/java/fr/xephi/authme/command/executable/authme/PurgeBannedPlayersCommand.java index 82b109cc..860ae73d 100644 --- a/src/main/java/fr/xephi/authme/command/executable/authme/PurgeBannedPlayersCommand.java +++ b/src/main/java/fr/xephi/authme/command/executable/authme/PurgeBannedPlayersCommand.java @@ -9,6 +9,7 @@ import org.bukkit.command.CommandSender; import javax.inject.Inject; import java.util.HashSet; import java.util.List; +import java.util.Locale; import java.util.Set; /** @@ -29,7 +30,7 @@ public class PurgeBannedPlayersCommand implements ExecutableCommand { Set bannedPlayers = bukkitService.getBannedPlayers(); Set namedBanned = new HashSet<>(bannedPlayers.size()); for (OfflinePlayer offlinePlayer : bannedPlayers) { - namedBanned.add(offlinePlayer.getName().toLowerCase()); + namedBanned.add(offlinePlayer.getName().toLowerCase(Locale.ROOT)); } purgeService.purgePlayers(sender, namedBanned, bannedPlayers.toArray(new OfflinePlayer[bannedPlayers.size()])); diff --git a/src/main/java/fr/xephi/authme/command/executable/authme/PurgePlayerCommand.java b/src/main/java/fr/xephi/authme/command/executable/authme/PurgePlayerCommand.java index ded4dd9d..e0bf9040 100644 --- a/src/main/java/fr/xephi/authme/command/executable/authme/PurgePlayerCommand.java +++ b/src/main/java/fr/xephi/authme/command/executable/authme/PurgePlayerCommand.java @@ -9,6 +9,7 @@ import org.bukkit.command.CommandSender; import javax.inject.Inject; import java.util.List; +import java.util.Locale; import static java.util.Collections.singletonList; @@ -36,7 +37,7 @@ public class PurgePlayerCommand implements ExecutableCommand { private void executeCommand(CommandSender sender, String name, String option) { if ("force".equals(option) || !dataSource.isAuthAvailable(name)) { OfflinePlayer offlinePlayer = bukkitService.getOfflinePlayer(name); - purgeExecutor.executePurge(singletonList(offlinePlayer), singletonList(name.toLowerCase())); + purgeExecutor.executePurge(singletonList(offlinePlayer), singletonList(name.toLowerCase(Locale.ROOT))); sender.sendMessage("Purged data for player " + name); } else { sender.sendMessage("This player is still registered! Are you sure you want to proceed? " diff --git a/src/main/java/fr/xephi/authme/command/executable/authme/RegisterAdminCommand.java b/src/main/java/fr/xephi/authme/command/executable/authme/RegisterAdminCommand.java index ada52966..eaa56a41 100644 --- a/src/main/java/fr/xephi/authme/command/executable/authme/RegisterAdminCommand.java +++ b/src/main/java/fr/xephi/authme/command/executable/authme/RegisterAdminCommand.java @@ -17,6 +17,7 @@ import org.bukkit.entity.Player; import javax.inject.Inject; import java.util.List; +import java.util.Locale; /** * Admin command to register a user. @@ -45,7 +46,7 @@ public class RegisterAdminCommand implements ExecutableCommand { // Get the player name and password final String playerName = arguments.get(0); final String playerPass = arguments.get(1); - final String playerNameLowerCase = playerName.toLowerCase(); + final String playerNameLowerCase = playerName.toLowerCase(Locale.ROOT); // Command logic ValidationResult passwordValidation = validationService.validatePassword(playerPass, playerName); diff --git a/src/main/java/fr/xephi/authme/command/executable/authme/debug/DebugCommand.java b/src/main/java/fr/xephi/authme/command/executable/authme/debug/DebugCommand.java index c7b0d8fc..4198a19e 100644 --- a/src/main/java/fr/xephi/authme/command/executable/authme/debug/DebugCommand.java +++ b/src/main/java/fr/xephi/authme/command/executable/authme/debug/DebugCommand.java @@ -9,6 +9,7 @@ import org.bukkit.command.CommandSender; import javax.inject.Inject; import java.util.List; +import java.util.Locale; import java.util.Map; import java.util.Set; import java.util.TreeMap; @@ -45,7 +46,7 @@ public class DebugCommand implements ExecutableCommand { if (arguments.isEmpty()) { return null; } - return getSections().get(arguments.get(0).toLowerCase()); + return getSections().get(arguments.get(0).toLowerCase(Locale.ROOT)); } private void sendAvailableSections(CommandSender sender) { diff --git a/src/main/java/fr/xephi/authme/command/executable/changepassword/ChangePasswordCommand.java b/src/main/java/fr/xephi/authme/command/executable/changepassword/ChangePasswordCommand.java index a1cc4f03..72ff55bc 100644 --- a/src/main/java/fr/xephi/authme/command/executable/changepassword/ChangePasswordCommand.java +++ b/src/main/java/fr/xephi/authme/command/executable/changepassword/ChangePasswordCommand.java @@ -12,6 +12,7 @@ import org.bukkit.entity.Player; import javax.inject.Inject; import java.util.List; +import java.util.Locale; /** * The command for a player to change his password with. @@ -35,7 +36,7 @@ public class ChangePasswordCommand extends PlayerCommand { @Override public void runCommand(Player player, List arguments) { - String name = player.getName().toLowerCase(); + String name = player.getName().toLowerCase(Locale.ROOT); if (!playerCache.isAuthenticated(name)) { commonService.send(player, MessageKey.NOT_LOGGED_IN); diff --git a/src/main/java/fr/xephi/authme/data/ProxySessionManager.java b/src/main/java/fr/xephi/authme/data/ProxySessionManager.java index c5a6fee9..d0c60fb2 100644 --- a/src/main/java/fr/xephi/authme/data/ProxySessionManager.java +++ b/src/main/java/fr/xephi/authme/data/ProxySessionManager.java @@ -4,6 +4,7 @@ import fr.xephi.authme.initialization.HasCleanup; import fr.xephi.authme.util.expiring.ExpiringSet; import javax.inject.Inject; +import java.util.Locale; import java.util.concurrent.TimeUnit; public class ProxySessionManager implements HasCleanup { @@ -21,7 +22,7 @@ public class ProxySessionManager implements HasCleanup { * @param name the player's name */ private void setActiveSession(String name) { - activeProxySessions.add(name.toLowerCase()); + activeProxySessions.add(name.toLowerCase(Locale.ROOT)); } /** diff --git a/src/main/java/fr/xephi/authme/data/VerificationCodeManager.java b/src/main/java/fr/xephi/authme/data/VerificationCodeManager.java index 1cd17668..0a8ff061 100644 --- a/src/main/java/fr/xephi/authme/data/VerificationCodeManager.java +++ b/src/main/java/fr/xephi/authme/data/VerificationCodeManager.java @@ -16,6 +16,7 @@ import org.bukkit.entity.Player; import javax.inject.Inject; import java.util.HashSet; +import java.util.Locale; import java.util.Set; import java.util.concurrent.TimeUnit; @@ -82,7 +83,7 @@ public class VerificationCodeManager implements SettingsDependent, HasCleanup { * @return true if the player has been verified, false otherwise */ private boolean isPlayerVerified(String name) { - return verifiedPlayers.contains(name.toLowerCase()); + return verifiedPlayers.contains(name.toLowerCase(Locale.ROOT)); } /** @@ -92,7 +93,7 @@ public class VerificationCodeManager implements SettingsDependent, HasCleanup { * @return true if the code exists, false otherwise */ public boolean hasCode(String name) { - return (verificationCodes.get(name.toLowerCase()) != null); + return (verificationCodes.get(name.toLowerCase(Locale.ROOT)) != null); } /** @@ -135,7 +136,7 @@ public class VerificationCodeManager implements SettingsDependent, HasCleanup { final String email = emailResult.getValue(); if (!Utils.isEmailEmpty(email)) { String code = RandomStringUtils.generateNum(6); // 6 digits code - verificationCodes.put(name.toLowerCase(), code); + verificationCodes.put(name.toLowerCase(Locale.ROOT), code); emailService.sendVerificationMail(name, email, code); } } @@ -150,7 +151,7 @@ public class VerificationCodeManager implements SettingsDependent, HasCleanup { */ public boolean checkCode(String name, String code) { boolean correct = false; - if (code.equals(verificationCodes.get(name.toLowerCase()))) { + if (code.equals(verificationCodes.get(name.toLowerCase(Locale.ROOT)))) { verify(name); correct = true; } @@ -163,7 +164,7 @@ public class VerificationCodeManager implements SettingsDependent, HasCleanup { * @param name the name of the player to generate a code for */ public void verify(String name) { - verifiedPlayers.add(name.toLowerCase()); + verifiedPlayers.add(name.toLowerCase(Locale.ROOT)); } /** @@ -172,7 +173,7 @@ public class VerificationCodeManager implements SettingsDependent, HasCleanup { * @param name the name of the player to generate a code for */ public void unverify(String name){ - verifiedPlayers.remove(name.toLowerCase()); + verifiedPlayers.remove(name.toLowerCase(Locale.ROOT)); } @Override 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 23aa8116..82082629 100644 --- a/src/main/java/fr/xephi/authme/data/auth/PlayerAuth.java +++ b/src/main/java/fr/xephi/authme/data/auth/PlayerAuth.java @@ -3,6 +3,7 @@ package fr.xephi.authme.data.auth; import fr.xephi.authme.security.crypts.HashedPassword; import org.bukkit.Location; +import java.util.Locale; import java.util.Objects; import java.util.Optional; import java.util.UUID; @@ -54,7 +55,7 @@ public class PlayerAuth { public void setNickname(String nickname) { - this.nickname = nickname.toLowerCase(); + this.nickname = nickname.toLowerCase(Locale.ROOT); } public String getNickname() { @@ -239,7 +240,7 @@ public class PlayerAuth { */ public PlayerAuth build() { PlayerAuth auth = new PlayerAuth(); - auth.nickname = checkNotNull(name).toLowerCase(); + auth.nickname = checkNotNull(name).toLowerCase(Locale.ROOT); auth.realName = Optional.ofNullable(realName).orElse("Player"); auth.password = Optional.ofNullable(password).orElse(new HashedPassword("")); auth.totpKey = totpKey; diff --git a/src/main/java/fr/xephi/authme/data/auth/PlayerCache.java b/src/main/java/fr/xephi/authme/data/auth/PlayerCache.java index 46fafbf7..e617f20e 100644 --- a/src/main/java/fr/xephi/authme/data/auth/PlayerCache.java +++ b/src/main/java/fr/xephi/authme/data/auth/PlayerCache.java @@ -1,6 +1,7 @@ package fr.xephi.authme.data.auth; +import java.util.Locale; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; @@ -20,7 +21,7 @@ public class PlayerCache { * @param auth the player auth object to save */ public void updatePlayer(PlayerAuth auth) { - cache.put(auth.getNickname().toLowerCase(), auth); + cache.put(auth.getNickname().toLowerCase(Locale.ROOT), auth); } /** @@ -29,7 +30,7 @@ public class PlayerCache { * @param user name of the player to remove */ public void removePlayer(String user) { - cache.remove(user.toLowerCase()); + cache.remove(user.toLowerCase(Locale.ROOT)); } /** @@ -40,7 +41,7 @@ public class PlayerCache { * @return true if player is logged in, false otherwise. */ public boolean isAuthenticated(String user) { - return cache.containsKey(user.toLowerCase()); + return cache.containsKey(user.toLowerCase(Locale.ROOT)); } /** @@ -51,7 +52,7 @@ public class PlayerCache { * @return the associated auth object, or null if not available */ public PlayerAuth getAuth(String user) { - return cache.get(user.toLowerCase()); + return cache.get(user.toLowerCase(Locale.ROOT)); } /** diff --git a/src/main/java/fr/xephi/authme/data/captcha/CaptchaCodeStorage.java b/src/main/java/fr/xephi/authme/data/captcha/CaptchaCodeStorage.java index 713edd69..5667a6f1 100644 --- a/src/main/java/fr/xephi/authme/data/captcha/CaptchaCodeStorage.java +++ b/src/main/java/fr/xephi/authme/data/captcha/CaptchaCodeStorage.java @@ -3,6 +3,7 @@ package fr.xephi.authme.data.captcha; import fr.xephi.authme.util.RandomStringUtils; import fr.xephi.authme.util.expiring.ExpiringMap; +import java.util.Locale; import java.util.concurrent.TimeUnit; /** @@ -51,7 +52,7 @@ public class CaptchaCodeStorage { * @return the code the player is required to enter */ public String getCodeOrGenerateNew(String name) { - String code = captchaCodes.get(name.toLowerCase()); + String code = captchaCodes.get(name.toLowerCase(Locale.ROOT)); return code == null ? generateCode(name) : code; } @@ -63,7 +64,7 @@ public class CaptchaCodeStorage { */ private String generateCode(String name) { String code = RandomStringUtils.generate(captchaLength); - captchaCodes.put(name.toLowerCase(), code); + captchaCodes.put(name.toLowerCase(Locale.ROOT), code); return code; } @@ -76,7 +77,7 @@ public class CaptchaCodeStorage { * @return true if the code matches, false otherwise */ public boolean checkCode(String name, String code) { - String nameLowerCase = name.toLowerCase(); + String nameLowerCase = name.toLowerCase(Locale.ROOT); String savedCode = captchaCodes.get(nameLowerCase); if (savedCode != null && savedCode.equalsIgnoreCase(code)) { captchaCodes.remove(nameLowerCase); diff --git a/src/main/java/fr/xephi/authme/data/captcha/LoginCaptchaManager.java b/src/main/java/fr/xephi/authme/data/captcha/LoginCaptchaManager.java index cf3958a1..1d97af69 100644 --- a/src/main/java/fr/xephi/authme/data/captcha/LoginCaptchaManager.java +++ b/src/main/java/fr/xephi/authme/data/captcha/LoginCaptchaManager.java @@ -8,6 +8,7 @@ import fr.xephi.authme.util.expiring.TimedCounter; import org.bukkit.entity.Player; import javax.inject.Inject; +import java.util.Locale; import java.util.concurrent.TimeUnit; /** @@ -36,14 +37,14 @@ public class LoginCaptchaManager implements CaptchaManager, SettingsDependent, H */ public void increaseLoginFailureCount(String name) { if (isEnabled) { - String playerLower = name.toLowerCase(); + String playerLower = name.toLowerCase(Locale.ROOT); playerCounts.increment(playerLower); } } @Override public boolean isCaptchaRequired(String playerName) { - return isEnabled && playerCounts.get(playerName.toLowerCase()) >= threshold; + return isEnabled && playerCounts.get(playerName.toLowerCase(Locale.ROOT)) >= threshold; } @Override @@ -53,7 +54,7 @@ public class LoginCaptchaManager implements CaptchaManager, SettingsDependent, H @Override public boolean checkCode(Player player, String code) { - String nameLower = player.getName().toLowerCase(); + String nameLower = player.getName().toLowerCase(Locale.ROOT); boolean isCodeCorrect = captchaCodeStorage.checkCode(nameLower, code); if (isCodeCorrect) { playerCounts.remove(nameLower); @@ -68,7 +69,7 @@ public class LoginCaptchaManager implements CaptchaManager, SettingsDependent, H */ public void resetLoginFailureCount(String name) { if (isEnabled) { - playerCounts.remove(name.toLowerCase()); + playerCounts.remove(name.toLowerCase(Locale.ROOT)); } } diff --git a/src/main/java/fr/xephi/authme/data/captcha/RegistrationCaptchaManager.java b/src/main/java/fr/xephi/authme/data/captcha/RegistrationCaptchaManager.java index 3b751247..655d9940 100644 --- a/src/main/java/fr/xephi/authme/data/captcha/RegistrationCaptchaManager.java +++ b/src/main/java/fr/xephi/authme/data/captcha/RegistrationCaptchaManager.java @@ -8,6 +8,7 @@ import fr.xephi.authme.util.expiring.ExpiringSet; import org.bukkit.entity.Player; import javax.inject.Inject; +import java.util.Locale; import java.util.concurrent.TimeUnit; /** @@ -31,7 +32,7 @@ public class RegistrationCaptchaManager implements CaptchaManager, SettingsDepen @Override public boolean isCaptchaRequired(String name) { - return isEnabled && !verifiedNamesForRegistration.contains(name.toLowerCase()); + return isEnabled && !verifiedNamesForRegistration.contains(name.toLowerCase(Locale.ROOT)); } @Override @@ -41,7 +42,7 @@ public class RegistrationCaptchaManager implements CaptchaManager, SettingsDepen @Override public boolean checkCode(Player player, String code) { - String nameLower = player.getName().toLowerCase(); + String nameLower = player.getName().toLowerCase(Locale.ROOT); boolean isCodeCorrect = captchaCodeStorage.checkCode(nameLower, code); if (isCodeCorrect) { verifiedNamesForRegistration.add(nameLower); diff --git a/src/main/java/fr/xephi/authme/data/limbo/LimboService.java b/src/main/java/fr/xephi/authme/data/limbo/LimboService.java index 937ed912..c8b46922 100644 --- a/src/main/java/fr/xephi/authme/data/limbo/LimboService.java +++ b/src/main/java/fr/xephi/authme/data/limbo/LimboService.java @@ -9,6 +9,7 @@ import org.bukkit.Location; import org.bukkit.entity.Player; import javax.inject.Inject; +import java.util.Locale; import java.util.Map; import java.util.Optional; import java.util.concurrent.ConcurrentHashMap; @@ -55,7 +56,7 @@ public class LimboService { * @param isRegistered whether or not the player is registered */ public void createLimboPlayer(Player player, boolean isRegistered) { - final String name = player.getName().toLowerCase(); + final String name = player.getName().toLowerCase(Locale.ROOT); LimboPlayer limboFromDisk = persistence.getLimboPlayer(player); if (limboFromDisk != null) { @@ -89,7 +90,7 @@ public class LimboService { * @return the associated limbo player, or null if none available */ public LimboPlayer getLimboPlayer(String name) { - return entries.get(name.toLowerCase()); + return entries.get(name.toLowerCase(Locale.ROOT)); } /** @@ -99,7 +100,7 @@ public class LimboService { * @return true if present, false otherwise */ public boolean hasLimboPlayer(String name) { - return entries.containsKey(name.toLowerCase()); + return entries.containsKey(name.toLowerCase(Locale.ROOT)); } /** @@ -111,7 +112,7 @@ public class LimboService { * @param player the player whose data should be restored */ public void restoreData(Player player) { - String lowerName = player.getName().toLowerCase(); + String lowerName = player.getName().toLowerCase(Locale.ROOT); LimboPlayer limbo = entries.remove(lowerName); if (limbo == null) { @@ -178,7 +179,7 @@ public class LimboService { * @return Optional with the limbo player */ private Optional getLimboOrLogError(Player player, String context) { - LimboPlayer limbo = entries.get(player.getName().toLowerCase()); + LimboPlayer limbo = entries.get(player.getName().toLowerCase(Locale.ROOT)); if (limbo == null) { logger.debug("No LimboPlayer found for `{0}`. Action: {1}", player.getName(), context); } diff --git a/src/main/java/fr/xephi/authme/datasource/CacheDataSource.java b/src/main/java/fr/xephi/authme/datasource/CacheDataSource.java index e1418dca..f6030e92 100644 --- a/src/main/java/fr/xephi/authme/datasource/CacheDataSource.java +++ b/src/main/java/fr/xephi/authme/datasource/CacheDataSource.java @@ -18,6 +18,7 @@ import fr.xephi.authme.util.Utils; import java.util.Collection; import java.util.List; +import java.util.Locale; import java.util.Optional; import java.util.Set; import java.util.concurrent.Executors; @@ -86,7 +87,7 @@ public class CacheDataSource implements DataSource { @Override public HashedPassword getPassword(String user) { - user = user.toLowerCase(); + user = user.toLowerCase(Locale.ROOT); Optional pAuthOpt = cachedAuths.getIfPresent(user); if (pAuthOpt != null && pAuthOpt.isPresent()) { return pAuthOpt.get().getPassword(); @@ -96,7 +97,7 @@ public class CacheDataSource implements DataSource { @Override public PlayerAuth getAuth(String user) { - user = user.toLowerCase(); + user = user.toLowerCase(Locale.ROOT); return cachedAuths.getUnchecked(user).orElse(null); } @@ -120,7 +121,7 @@ public class CacheDataSource implements DataSource { @Override public boolean updatePassword(String user, HashedPassword password) { - user = user.toLowerCase(); + user = user.toLowerCase(Locale.ROOT); boolean result = source.updatePassword(user, password); if (result) { cachedAuths.refresh(user); @@ -153,7 +154,7 @@ public class CacheDataSource implements DataSource { @Override public boolean removeAuth(String name) { - name = name.toLowerCase(); + name = name.toLowerCase(Locale.ROOT); boolean result = source.removeAuth(name); if (result) { cachedAuths.invalidate(name); @@ -210,12 +211,12 @@ public class CacheDataSource implements DataSource { @Override public void setLogged(final String user) { - source.setLogged(user.toLowerCase()); + source.setLogged(user.toLowerCase(Locale.ROOT)); } @Override public void setUnlogged(final String user) { - source.setUnlogged(user.toLowerCase()); + source.setUnlogged(user.toLowerCase(Locale.ROOT)); } @Override diff --git a/src/main/java/fr/xephi/authme/datasource/MySQL.java b/src/main/java/fr/xephi/authme/datasource/MySQL.java index ff571c54..0a3fcd43 100644 --- a/src/main/java/fr/xephi/authme/datasource/MySQL.java +++ b/src/main/java/fr/xephi/authme/datasource/MySQL.java @@ -24,6 +24,7 @@ import java.util.ArrayList; import java.util.Collection; import java.util.HashSet; import java.util.List; +import java.util.Locale; import java.util.Set; import java.util.UUID; @@ -309,7 +310,7 @@ public class MySQL extends AbstractSqlDataSource { String sql = "SELECT * FROM " + tableName + " WHERE " + col.NAME + "=?;"; PlayerAuth auth; try (Connection con = getConnection(); PreparedStatement pst = con.prepareStatement(sql)) { - pst.setString(1, user.toLowerCase()); + pst.setString(1, user.toLowerCase(Locale.ROOT)); try (ResultSet rs = pst.executeQuery()) { if (rs.next()) { int id = rs.getInt(col.ID); @@ -377,11 +378,11 @@ public class MySQL extends AbstractSqlDataSource { @Override public boolean removeAuth(String user) { - user = user.toLowerCase(); + user = user.toLowerCase(Locale.ROOT); String sql = "DELETE FROM " + tableName + " WHERE " + col.NAME + "=?;"; try (Connection con = getConnection(); PreparedStatement pst = con.prepareStatement(sql)) { sqlExtension.removeAuth(user, con); - pst.setString(1, user.toLowerCase()); + pst.setString(1, user.toLowerCase(Locale.ROOT)); pst.executeUpdate(); return true; } catch (SQLException ex) { @@ -402,7 +403,7 @@ public class MySQL extends AbstractSqlDataSource { String sql = "DELETE FROM " + tableName + " WHERE " + col.NAME + "=?;"; try (Connection con = getConnection(); PreparedStatement pst = con.prepareStatement(sql)) { for (String name : toPurge) { - pst.setString(1, name.toLowerCase()); + pst.setString(1, name.toLowerCase(Locale.ROOT)); pst.executeUpdate(); } } catch (SQLException ex) { @@ -470,7 +471,7 @@ public class MySQL extends AbstractSqlDataSource { String sql = "UPDATE " + tableName + " SET " + col.TOTP_KEY + " = ? WHERE " + col.NAME + " = ?"; try (Connection con = getConnection(); PreparedStatement pst = con.prepareStatement(sql)) { pst.setString(1, totpKey); - pst.setString(2, user.toLowerCase()); + pst.setString(2, user.toLowerCase(Locale.ROOT)); pst.executeUpdate(); return true; } catch (SQLException e) { diff --git a/src/main/java/fr/xephi/authme/datasource/PostgreSqlDataSource.java b/src/main/java/fr/xephi/authme/datasource/PostgreSqlDataSource.java index 070c719a..cc308934 100644 --- a/src/main/java/fr/xephi/authme/datasource/PostgreSqlDataSource.java +++ b/src/main/java/fr/xephi/authme/datasource/PostgreSqlDataSource.java @@ -23,6 +23,7 @@ import java.util.ArrayList; import java.util.Collection; import java.util.HashSet; import java.util.List; +import java.util.Locale; import java.util.Set; import static fr.xephi.authme.datasource.SqlDataSourceUtils.getNullableLong; @@ -257,7 +258,7 @@ public class PostgreSqlDataSource extends AbstractSqlDataSource { } private boolean isColumnMissing(DatabaseMetaData metaData, String columnName) throws SQLException { - try (ResultSet rs = metaData.getColumns(null, null, tableName, columnName.toLowerCase())) { + try (ResultSet rs = metaData.getColumns(null, null, tableName, columnName.toLowerCase(Locale.ROOT))) { return !rs.next(); } } @@ -267,7 +268,7 @@ public class PostgreSqlDataSource extends AbstractSqlDataSource { String sql = "SELECT * FROM " + tableName + " WHERE " + col.NAME + "=?;"; PlayerAuth auth; try (Connection con = getConnection(); PreparedStatement pst = con.prepareStatement(sql)) { - pst.setString(1, user.toLowerCase()); + pst.setString(1, user.toLowerCase(Locale.ROOT)); try (ResultSet rs = pst.executeQuery()) { if (rs.next()) { int id = rs.getInt(col.ID); @@ -335,11 +336,11 @@ public class PostgreSqlDataSource extends AbstractSqlDataSource { @Override public boolean removeAuth(String user) { - user = user.toLowerCase(); + user = user.toLowerCase(Locale.ROOT); String sql = "DELETE FROM " + tableName + " WHERE " + col.NAME + "=?;"; try (Connection con = getConnection(); PreparedStatement pst = con.prepareStatement(sql)) { sqlExtension.removeAuth(user, con); - pst.setString(1, user.toLowerCase()); + pst.setString(1, user.toLowerCase(Locale.ROOT)); pst.executeUpdate(); return true; } catch (SQLException ex) { @@ -360,7 +361,7 @@ public class PostgreSqlDataSource extends AbstractSqlDataSource { String sql = "DELETE FROM " + tableName + " WHERE " + col.NAME + "=?;"; try (Connection con = getConnection(); PreparedStatement pst = con.prepareStatement(sql)) { for (String name : toPurge) { - pst.setString(1, name.toLowerCase()); + pst.setString(1, name.toLowerCase(Locale.ROOT)); pst.executeUpdate(); } } catch (SQLException ex) { @@ -428,7 +429,7 @@ public class PostgreSqlDataSource extends AbstractSqlDataSource { String sql = "UPDATE " + tableName + " SET " + col.TOTP_KEY + " = ? WHERE " + col.NAME + " = ?"; try (Connection con = getConnection(); PreparedStatement pst = con.prepareStatement(sql)) { pst.setString(1, totpKey); - pst.setString(2, user.toLowerCase()); + pst.setString(2, user.toLowerCase(Locale.ROOT)); pst.executeUpdate(); return true; } catch (SQLException e) { diff --git a/src/main/java/fr/xephi/authme/datasource/SQLite.java b/src/main/java/fr/xephi/authme/datasource/SQLite.java index 96650808..b261b5d5 100644 --- a/src/main/java/fr/xephi/authme/datasource/SQLite.java +++ b/src/main/java/fr/xephi/authme/datasource/SQLite.java @@ -20,6 +20,7 @@ import java.util.ArrayList; import java.util.Collection; import java.util.HashSet; import java.util.List; +import java.util.Locale; import java.util.Set; import static fr.xephi.authme.datasource.SqlDataSourceUtils.getNullableLong; @@ -268,7 +269,7 @@ public class SQLite extends AbstractSqlDataSource { String delete = "DELETE FROM " + tableName + " WHERE " + col.NAME + "=?;"; try (PreparedStatement deletePst = con.prepareStatement(delete)) { for (String name : toPurge) { - deletePst.setString(1, name.toLowerCase()); + deletePst.setString(1, name.toLowerCase(Locale.ROOT)); deletePst.executeUpdate(); } } catch (SQLException ex) { @@ -280,7 +281,7 @@ public class SQLite extends AbstractSqlDataSource { public boolean removeAuth(String user) { String sql = "DELETE FROM " + tableName + " WHERE " + col.NAME + "=?;"; try (PreparedStatement pst = con.prepareStatement(sql)) { - pst.setString(1, user.toLowerCase()); + pst.setString(1, user.toLowerCase(Locale.ROOT)); pst.executeUpdate(); return true; } catch (SQLException ex) { @@ -355,7 +356,7 @@ public class SQLite extends AbstractSqlDataSource { String sql = "UPDATE " + tableName + " SET " + col.TOTP_KEY + " = ? WHERE " + col.NAME + " = ?"; try (PreparedStatement pst = con.prepareStatement(sql)) { pst.setString(1, totpKey); - pst.setString(2, user.toLowerCase()); + pst.setString(2, user.toLowerCase(Locale.ROOT)); pst.executeUpdate(); return true; } catch (SQLException e) { diff --git a/src/main/java/fr/xephi/authme/datasource/columnshandler/AuthMeColumnsHandler.java b/src/main/java/fr/xephi/authme/datasource/columnshandler/AuthMeColumnsHandler.java index f923bffe..fc172dcf 100644 --- a/src/main/java/fr/xephi/authme/datasource/columnshandler/AuthMeColumnsHandler.java +++ b/src/main/java/fr/xephi/authme/datasource/columnshandler/AuthMeColumnsHandler.java @@ -14,6 +14,7 @@ import fr.xephi.authme.settings.properties.DatabaseSettings; import java.sql.Connection; import java.sql.SQLException; import java.util.List; +import java.util.Locale; import static ch.jalu.datasourcecolumns.sqlimplementation.SqlColumnsHandlerConfig.forConnectionPool; import static ch.jalu.datasourcecolumns.sqlimplementation.SqlColumnsHandlerConfig.forSingleConnection; @@ -78,7 +79,7 @@ public final class AuthMeColumnsHandler { */ public boolean update(String name, DataSourceColumn column, T value) { try { - return internalHandler.update(name.toLowerCase(), column, value); + return internalHandler.update(name.toLowerCase(Locale.ROOT), column, value); } catch (SQLException e) { logSqlException(e); return false; @@ -110,7 +111,7 @@ public final class AuthMeColumnsHandler { */ public boolean update(String name, UpdateValues updateValues) { try { - return internalHandler.update(name.toLowerCase(), updateValues); + return internalHandler.update(name.toLowerCase(Locale.ROOT), updateValues); } catch (SQLException e) { logSqlException(e); return false; @@ -145,7 +146,7 @@ public final class AuthMeColumnsHandler { * @throws SQLException . */ public DataSourceValue retrieve(String name, DataSourceColumn column) throws SQLException { - return internalHandler.retrieve(name.toLowerCase(), column); + return internalHandler.retrieve(name.toLowerCase(Locale.ROOT), column); } /** @@ -157,7 +158,7 @@ public final class AuthMeColumnsHandler { * @throws SQLException . */ public DataSourceValues retrieve(String name, DataSourceColumn... columns) throws SQLException { - return internalHandler.retrieve(name.toLowerCase(), columns); + return internalHandler.retrieve(name.toLowerCase(Locale.ROOT), columns); } /** 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 b1c9613e..a9197223 100644 --- a/src/main/java/fr/xephi/authme/datasource/converter/CrazyLoginConverter.java +++ b/src/main/java/fr/xephi/authme/datasource/converter/CrazyLoginConverter.java @@ -14,6 +14,7 @@ import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.IOException; +import java.util.Locale; /** * Converter for CrazyLogin to AuthMe. @@ -70,7 +71,7 @@ public class CrazyLoginConverter implements Converter { String password = args[1]; if (password != null) { PlayerAuth auth = PlayerAuth.builder() - .name(playerName.toLowerCase()) + .name(playerName.toLowerCase(Locale.ROOT)) .realName(playerName) .password(password, null) .build(); diff --git a/src/main/java/fr/xephi/authme/datasource/converter/RoyalAuthConverter.java b/src/main/java/fr/xephi/authme/datasource/converter/RoyalAuthConverter.java index 7c45aebf..ebb9080e 100644 --- a/src/main/java/fr/xephi/authme/datasource/converter/RoyalAuthConverter.java +++ b/src/main/java/fr/xephi/authme/datasource/converter/RoyalAuthConverter.java @@ -12,6 +12,7 @@ import org.bukkit.configuration.file.YamlConfiguration; import javax.inject.Inject; import java.io.File; +import java.util.Locale; import static fr.xephi.authme.util.FileUtils.makePath; @@ -35,7 +36,7 @@ public class RoyalAuthConverter implements Converter { public void execute(CommandSender sender) { for (OfflinePlayer player : plugin.getServer().getOfflinePlayers()) { try { - String name = player.getName().toLowerCase(); + String name = player.getName().toLowerCase(Locale.ROOT); File file = new File(makePath(".", "plugins", "RoyalAuth", "userdata", name + ".yml")); if (dataSource.isAuthAvailable(name) || !file.exists()) { diff --git a/src/main/java/fr/xephi/authme/datasource/converter/VAuthConverter.java b/src/main/java/fr/xephi/authme/datasource/converter/VAuthConverter.java index e9c70607..95af9011 100644 --- a/src/main/java/fr/xephi/authme/datasource/converter/VAuthConverter.java +++ b/src/main/java/fr/xephi/authme/datasource/converter/VAuthConverter.java @@ -12,6 +12,7 @@ import org.bukkit.command.CommandSender; import javax.inject.Inject; import java.io.File; import java.io.IOException; +import java.util.Locale; import java.util.Scanner; import java.util.UUID; @@ -48,12 +49,12 @@ public class VAuthConverter implements Converter { continue; } auth = PlayerAuth.builder() - .name(pname.toLowerCase()) + .name(pname.toLowerCase(Locale.ROOT)) .realName(pname) .password(password, null).build(); } else { auth = PlayerAuth.builder() - .name(name.toLowerCase()) + .name(name.toLowerCase(Locale.ROOT)) .realName(name) .password(password, null).build(); } diff --git a/src/main/java/fr/xephi/authme/datasource/converter/XAuthConverter.java b/src/main/java/fr/xephi/authme/datasource/converter/XAuthConverter.java index 92856658..0f04310c 100644 --- a/src/main/java/fr/xephi/authme/datasource/converter/XAuthConverter.java +++ b/src/main/java/fr/xephi/authme/datasource/converter/XAuthConverter.java @@ -18,6 +18,7 @@ import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; +import java.util.Locale; import static fr.xephi.authme.util.FileUtils.makePath; @@ -66,7 +67,7 @@ public class XAuthConverter implements Converter { String psw = getPassword(id); if (psw != null && !psw.isEmpty() && pl != null) { PlayerAuth auth = PlayerAuth.builder() - .name(pl.toLowerCase()) + .name(pl.toLowerCase(Locale.ROOT)) .realName(pl) .password(psw, null).build(); database.saveAuth(auth); @@ -89,7 +90,7 @@ public class XAuthConverter implements Converter { if (!rs.next()) { return null; } - realPass = rs.getString("playername").toLowerCase(); + realPass = rs.getString("playername").toLowerCase(Locale.ROOT); } catch (SQLException e) { xAuthLog.severe("Failed to retrieve name for account: " + id, e); return null; diff --git a/src/main/java/fr/xephi/authme/initialization/OnShutdownPlayerSaver.java b/src/main/java/fr/xephi/authme/initialization/OnShutdownPlayerSaver.java index 742318e4..261e7dd5 100644 --- a/src/main/java/fr/xephi/authme/initialization/OnShutdownPlayerSaver.java +++ b/src/main/java/fr/xephi/authme/initialization/OnShutdownPlayerSaver.java @@ -14,6 +14,7 @@ import org.bukkit.Location; import org.bukkit.entity.Player; import javax.inject.Inject; +import java.util.Locale; /** * Saves all players' data when the plugin shuts down. @@ -48,7 +49,7 @@ public class OnShutdownPlayerSaver { } private void savePlayer(Player player) { - String name = player.getName().toLowerCase(); + String name = player.getName().toLowerCase(Locale.ROOT); if (PlayerUtils.isNpc(player) || validationService.isUnrestricted(name)) { return; } @@ -64,7 +65,7 @@ public class OnShutdownPlayerSaver { if (settings.getProperty(RestrictionSettings.SAVE_QUIT_LOCATION)) { Location loc = spawnLoader.getPlayerLocationOrSpawn(player); PlayerAuth auth = PlayerAuth.builder() - .name(player.getName().toLowerCase()) + .name(player.getName().toLowerCase(Locale.ROOT)) .realName(player.getName()) .location(loc).build(); dataSource.updateQuitLoc(auth); diff --git a/src/main/java/fr/xephi/authme/listener/OnJoinVerifier.java b/src/main/java/fr/xephi/authme/listener/OnJoinVerifier.java index ce61b8f2..9ceccbaf 100644 --- a/src/main/java/fr/xephi/authme/listener/OnJoinVerifier.java +++ b/src/main/java/fr/xephi/authme/listener/OnJoinVerifier.java @@ -25,6 +25,7 @@ import org.bukkit.event.player.PlayerLoginEvent; import javax.annotation.PostConstruct; import javax.inject.Inject; import java.util.Collection; +import java.util.Locale; import java.util.regex.Pattern; /** @@ -160,7 +161,7 @@ public class OnJoinVerifier implements Reloadable { String realName = auth.getRealName(); // might be null or "Player" if (StringUtils.isEmpty(realName) || "Player".equals(realName)) { - dataSource.updateRealName(connectingName.toLowerCase(), connectingName); + dataSource.updateRealName(connectingName.toLowerCase(Locale.ROOT), connectingName); } else if (!realName.equals(connectingName)) { throw new FailedVerificationException(MessageKey.INVALID_NAME_CASE, realName, connectingName); } diff --git a/src/main/java/fr/xephi/authme/listener/PlayerListener.java b/src/main/java/fr/xephi/authme/listener/PlayerListener.java index 727f45a7..53ea908f 100644 --- a/src/main/java/fr/xephi/authme/listener/PlayerListener.java +++ b/src/main/java/fr/xephi/authme/listener/PlayerListener.java @@ -52,6 +52,7 @@ import org.bukkit.event.player.PlayerShearEntityEvent; import org.bukkit.inventory.InventoryView; import javax.inject.Inject; +import java.util.Locale; import java.util.Set; import static fr.xephi.authme.settings.properties.RestrictionSettings.ALLOWED_MOVEMENT_RADIUS; @@ -214,7 +215,7 @@ public class PlayerListener implements Listener { return; } - String name = player.getName().toLowerCase(); + String name = player.getName().toLowerCase(Locale.ROOT); String joinMsg = event.getJoinMessage(); // Remove the join message while the player isn't logging in @@ -292,7 +293,7 @@ public class PlayerListener implements Listener { @EventHandler(ignoreCancelled = true, priority = EventPriority.LOWEST) public void onPlayerCommandPreprocess(PlayerCommandPreprocessEvent event) { - String cmd = event.getMessage().split(" ")[0].toLowerCase(); + String cmd = event.getMessage().split(" ")[0].toLowerCase(Locale.ROOT); if (settings.getProperty(HooksSettings.USE_ESSENTIALS_MOTD) && "/motd".equals(cmd)) { return; } @@ -482,7 +483,7 @@ public class PlayerListener implements Listener { return false; } Set whitelist = settings.getProperty(RestrictionSettings.UNRESTRICTED_INVENTORIES); - return whitelist.contains(ChatColor.stripColor(inventory.getTitle()).toLowerCase()); + return whitelist.contains(ChatColor.stripColor(inventory.getTitle()).toLowerCase(Locale.ROOT)); } @EventHandler(ignoreCancelled = true, priority = EventPriority.LOWEST) diff --git a/src/main/java/fr/xephi/authme/output/LogFilterHelper.java b/src/main/java/fr/xephi/authme/output/LogFilterHelper.java index fa43a01c..6058584a 100644 --- a/src/main/java/fr/xephi/authme/output/LogFilterHelper.java +++ b/src/main/java/fr/xephi/authme/output/LogFilterHelper.java @@ -6,6 +6,7 @@ import fr.xephi.authme.util.StringUtils; import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.Locale; /** * Service class for the log filters. @@ -35,7 +36,7 @@ final class LogFilterHelper { if (message == null) { return false; } - String lowerMessage = message.toLowerCase(); + String lowerMessage = message.toLowerCase(Locale.ROOT); return lowerMessage.contains(ISSUED_COMMAND_TEXT) && StringUtils.containsAny(lowerMessage, COMMANDS_TO_SKIP); } 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 9ae2934a..62bd4ea0 100644 --- a/src/main/java/fr/xephi/authme/process/changepassword/AsyncChangePassword.java +++ b/src/main/java/fr/xephi/authme/process/changepassword/AsyncChangePassword.java @@ -14,6 +14,7 @@ import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import javax.inject.Inject; +import java.util.Locale; public class AsyncChangePassword implements AsynchronousProcess { @@ -42,7 +43,7 @@ public class AsyncChangePassword implements AsynchronousProcess { * @param newPassword the new password chosen by the player */ public void changePassword(Player player, String oldPassword, String newPassword) { - String name = player.getName().toLowerCase(); + String name = player.getName().toLowerCase(Locale.ROOT); PlayerAuth auth = playerCache.getAuth(name); if (passwordSecurity.comparePassword(oldPassword, auth.getPassword(), player.getName())) { HashedPassword hashedPassword = passwordSecurity.computeHash(newPassword, name); @@ -71,7 +72,7 @@ public class AsyncChangePassword implements AsynchronousProcess { * @param newPassword the new password chosen for the player */ public void changePasswordAsAdmin(CommandSender sender, String playerName, String newPassword) { - String lowerCaseName = playerName.toLowerCase(); + String lowerCaseName = playerName.toLowerCase(Locale.ROOT); if (!(playerCache.isAuthenticated(lowerCaseName) || dataSource.isAuthAvailable(lowerCaseName))) { if (sender == null) { logger.warning("Tried to change password for user " + lowerCaseName + " but it doesn't exist!"); diff --git a/src/main/java/fr/xephi/authme/process/email/AsyncAddEmail.java b/src/main/java/fr/xephi/authme/process/email/AsyncAddEmail.java index 9041e01a..f1c3030a 100644 --- a/src/main/java/fr/xephi/authme/process/email/AsyncAddEmail.java +++ b/src/main/java/fr/xephi/authme/process/email/AsyncAddEmail.java @@ -15,6 +15,7 @@ import fr.xephi.authme.util.Utils; import org.bukkit.entity.Player; import javax.inject.Inject; +import java.util.Locale; /** * Async task to add an email to an account. @@ -48,7 +49,7 @@ public class AsyncAddEmail implements AsynchronousProcess { * @param email the email to add */ public void addEmail(Player player, String email) { - String playerName = player.getName().toLowerCase(); + String playerName = player.getName().toLowerCase(Locale.ROOT); if (playerCache.isAuthenticated(playerName)) { PlayerAuth auth = playerCache.getAuth(playerName); diff --git a/src/main/java/fr/xephi/authme/process/email/AsyncChangeEmail.java b/src/main/java/fr/xephi/authme/process/email/AsyncChangeEmail.java index ccbe5ba1..61cba0fb 100644 --- a/src/main/java/fr/xephi/authme/process/email/AsyncChangeEmail.java +++ b/src/main/java/fr/xephi/authme/process/email/AsyncChangeEmail.java @@ -14,6 +14,7 @@ import fr.xephi.authme.service.ValidationService; import org.bukkit.entity.Player; import javax.inject.Inject; +import java.util.Locale; /** * Async task for changing the email. @@ -48,7 +49,7 @@ public class AsyncChangeEmail implements AsynchronousProcess { * @param newEmail provided new email */ public void changeEmail(Player player, String oldEmail, String newEmail) { - String playerName = player.getName().toLowerCase(); + String playerName = player.getName().toLowerCase(Locale.ROOT); if (playerCache.isAuthenticated(playerName)) { PlayerAuth auth = playerCache.getAuth(playerName); String currentEmail = auth.getEmail(); diff --git a/src/main/java/fr/xephi/authme/process/join/AsynchronousJoin.java b/src/main/java/fr/xephi/authme/process/join/AsynchronousJoin.java index 725faa83..d5cf1cef 100644 --- a/src/main/java/fr/xephi/authme/process/join/AsynchronousJoin.java +++ b/src/main/java/fr/xephi/authme/process/join/AsynchronousJoin.java @@ -32,6 +32,8 @@ import org.bukkit.potion.PotionEffectType; import javax.inject.Inject; +import java.util.Locale; + import static fr.xephi.authme.service.BukkitService.TICKS_PER_SECOND; import static fr.xephi.authme.settings.properties.RestrictionSettings.PROTECT_INVENTORY_BEFORE_LOGIN; @@ -90,7 +92,7 @@ public class AsynchronousJoin implements AsynchronousProcess { * @param player the player to process */ public void processJoin(Player player) { - String name = player.getName().toLowerCase(); + String name = player.getName().toLowerCase(Locale.ROOT); String ip = PlayerUtils.getPlayerIp(player); if (!validationService.fulfillsNameRestrictions(player)) { diff --git a/src/main/java/fr/xephi/authme/process/login/AsynchronousLogin.java b/src/main/java/fr/xephi/authme/process/login/AsynchronousLogin.java index 4b86a567..5ce23d8b 100644 --- a/src/main/java/fr/xephi/authme/process/login/AsynchronousLogin.java +++ b/src/main/java/fr/xephi/authme/process/login/AsynchronousLogin.java @@ -40,6 +40,7 @@ import org.bukkit.entity.Player; import javax.inject.Inject; import java.util.ArrayList; import java.util.List; +import java.util.Locale; /** * Asynchronous task for a player login. @@ -153,7 +154,7 @@ public class AsynchronousLogin implements AsynchronousProcess { * (e.g. because he is already logged in) */ private PlayerAuth getPlayerAuth(Player player, boolean quiet) { - String name = player.getName().toLowerCase(); + String name = player.getName().toLowerCase(Locale.ROOT); if (playerCache.isAuthenticated(name)) { if (!quiet) { service.send(player, MessageKey.ALREADY_LOGGED_IN_ERROR); @@ -206,7 +207,7 @@ public class AsynchronousLogin implements AsynchronousProcess { * false otherwise */ private boolean checkPlayerInfo(Player player, PlayerAuth auth, String password) { - String name = player.getName().toLowerCase(); + String name = player.getName().toLowerCase(Locale.ROOT); // If captcha is required send a message to the player and deny to log in if (loginCaptchaManager.isCaptchaRequired(name)) { @@ -380,7 +381,7 @@ public class AsynchronousLogin implements AsynchronousProcess { for (Player onlinePlayer : bukkitService.getOnlinePlayers()) { if (ip.equalsIgnoreCase(PlayerUtils.getPlayerIp(onlinePlayer)) && !onlinePlayer.getName().equals(name) - && dataSource.isLogged(onlinePlayer.getName().toLowerCase())) { + && dataSource.isLogged(onlinePlayer.getName().toLowerCase(Locale.ROOT))) { ++count; } } 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 8501e85c..74946039 100644 --- a/src/main/java/fr/xephi/authme/process/login/ProcessSyncPlayerLogin.java +++ b/src/main/java/fr/xephi/authme/process/login/ProcessSyncPlayerLogin.java @@ -22,6 +22,7 @@ import org.bukkit.potion.PotionEffectType; import javax.inject.Inject; import java.util.List; +import java.util.Locale; import static fr.xephi.authme.settings.properties.RestrictionSettings.PROTECT_INVENTORY_BEFORE_LOGIN; @@ -76,7 +77,7 @@ public class ProcessSyncPlayerLogin implements SynchronousProcess { * @param authsWithSameIp registered names with the same IP address as the player's */ public void processPlayerLogin(Player player, boolean isFirstLogin, List authsWithSameIp) { - final String name = player.getName().toLowerCase(); + final String name = player.getName().toLowerCase(Locale.ROOT); final LimboPlayer limbo = limboService.getLimboPlayer(name); // Limbo contains the State of the Player before /login diff --git a/src/main/java/fr/xephi/authme/process/logout/AsynchronousLogout.java b/src/main/java/fr/xephi/authme/process/logout/AsynchronousLogout.java index 3628669b..2e5bd87c 100644 --- a/src/main/java/fr/xephi/authme/process/logout/AsynchronousLogout.java +++ b/src/main/java/fr/xephi/authme/process/logout/AsynchronousLogout.java @@ -15,6 +15,7 @@ import fr.xephi.authme.settings.properties.RestrictionSettings; import org.bukkit.entity.Player; import javax.inject.Inject; +import java.util.Locale; /** * Async task when a player wants to log out. @@ -51,7 +52,7 @@ public class AsynchronousLogout implements AsynchronousProcess { * @param player the player wanting to log out */ public void logout(Player player) { - String name = player.getName().toLowerCase(); + String name = player.getName().toLowerCase(Locale.ROOT); if (!playerCache.isAuthenticated(name)) { service.send(player, MessageKey.NOT_LOGGED_IN); return; diff --git a/src/main/java/fr/xephi/authme/process/quit/AsynchronousQuit.java b/src/main/java/fr/xephi/authme/process/quit/AsynchronousQuit.java index e2ad6d43..f4b1d325 100644 --- a/src/main/java/fr/xephi/authme/process/quit/AsynchronousQuit.java +++ b/src/main/java/fr/xephi/authme/process/quit/AsynchronousQuit.java @@ -18,6 +18,7 @@ import org.bukkit.Location; import org.bukkit.entity.Player; import javax.inject.Inject; +import java.util.Locale; /** * Async process called when a player quits the server. @@ -63,7 +64,7 @@ public class AsynchronousQuit implements AsynchronousProcess { if (player == null || validationService.isUnrestricted(player.getName())) { return; } - String name = player.getName().toLowerCase(); + String name = player.getName().toLowerCase(Locale.ROOT); boolean wasLoggedIn = playerCache.isAuthenticated(name); if (wasLoggedIn) { diff --git a/src/main/java/fr/xephi/authme/process/register/AsyncRegister.java b/src/main/java/fr/xephi/authme/process/register/AsyncRegister.java index 979d6db7..f5fe3be6 100644 --- a/src/main/java/fr/xephi/authme/process/register/AsyncRegister.java +++ b/src/main/java/fr/xephi/authme/process/register/AsyncRegister.java @@ -20,6 +20,7 @@ import org.bukkit.entity.Player; import javax.inject.Inject; import java.util.List; +import java.util.Locale; import static fr.xephi.authme.permission.PlayerStatePermission.ALLOW_MULTIPLE_ACCOUNTS; @@ -67,7 +68,7 @@ public class AsyncRegister implements AsynchronousProcess { * @return true if the checks are successful and the event hasn't marked the action as denied, false otherwise. */ private boolean preRegisterCheck(RegistrationMethod variant, Player player) { - String name = player.getName().toLowerCase(); + String name = player.getName().toLowerCase(Locale.ROOT); if (playerCache.isAuthenticated(name)) { service.send(player, MessageKey.ALREADY_LOGGED_IN_ERROR); return false; diff --git a/src/main/java/fr/xephi/authme/process/register/executors/PlayerAuthBuilderHelper.java b/src/main/java/fr/xephi/authme/process/register/executors/PlayerAuthBuilderHelper.java index a9717fdc..9b29dac2 100644 --- a/src/main/java/fr/xephi/authme/process/register/executors/PlayerAuthBuilderHelper.java +++ b/src/main/java/fr/xephi/authme/process/register/executors/PlayerAuthBuilderHelper.java @@ -5,6 +5,8 @@ import fr.xephi.authme.security.crypts.HashedPassword; import fr.xephi.authme.util.PlayerUtils; import org.bukkit.entity.Player; +import java.util.Locale; + /** * Helper for constructing PlayerAuth objects. */ @@ -23,7 +25,7 @@ final class PlayerAuthBuilderHelper { */ static PlayerAuth createPlayerAuth(Player player, HashedPassword hashedPassword, String email) { return PlayerAuth.builder() - .name(player.getName().toLowerCase()) + .name(player.getName().toLowerCase(Locale.ROOT)) .realName(player.getName()) .password(hashedPassword) .email(email) diff --git a/src/main/java/fr/xephi/authme/security/PasswordSecurity.java b/src/main/java/fr/xephi/authme/security/PasswordSecurity.java index d6cb6e71..012fd3e5 100644 --- a/src/main/java/fr/xephi/authme/security/PasswordSecurity.java +++ b/src/main/java/fr/xephi/authme/security/PasswordSecurity.java @@ -13,6 +13,7 @@ import org.bukkit.plugin.PluginManager; import javax.annotation.PostConstruct; import javax.inject.Inject; import java.util.Collection; +import java.util.Locale; /** * Manager class for password-related operations. @@ -54,7 +55,7 @@ public class PasswordSecurity implements Reloadable { * @return The password hash */ public HashedPassword computeHash(String password, String playerName) { - String playerLowerCase = playerName.toLowerCase(); + String playerLowerCase = playerName.toLowerCase(Locale.ROOT); return encryptionMethod.computeHash(password, playerLowerCase); } @@ -81,7 +82,7 @@ public class PasswordSecurity implements Reloadable { * @return True if the password matches, false otherwise */ public boolean comparePassword(String password, HashedPassword hashedPassword, String playerName) { - String playerLowerCase = playerName.toLowerCase(); + String playerLowerCase = playerName.toLowerCase(Locale.ROOT); return methodMatches(encryptionMethod, password, hashedPassword, playerLowerCase) || compareWithLegacyHashes(password, hashedPassword, playerLowerCase); } diff --git a/src/main/java/fr/xephi/authme/security/crypts/Smf.java b/src/main/java/fr/xephi/authme/security/crypts/Smf.java index e24c1b83..19193d63 100644 --- a/src/main/java/fr/xephi/authme/security/crypts/Smf.java +++ b/src/main/java/fr/xephi/authme/security/crypts/Smf.java @@ -7,6 +7,8 @@ import fr.xephi.authme.security.crypts.description.SaltType; import fr.xephi.authme.security.crypts.description.Usage; import fr.xephi.authme.util.RandomStringUtils; +import java.util.Locale; + import static fr.xephi.authme.security.HashUtils.isEqual; /** @@ -29,7 +31,7 @@ public class Smf implements EncryptionMethod { @Override public String computeHash(String password, String salt, String name) { - return HashUtils.sha1(name.toLowerCase() + password); + return HashUtils.sha1(name.toLowerCase(Locale.ROOT) + password); } @Override 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 62f2e0d7..3cd4ceab 100644 --- a/src/main/java/fr/xephi/authme/security/crypts/XAuth.java +++ b/src/main/java/fr/xephi/authme/security/crypts/XAuth.java @@ -3,6 +3,8 @@ package fr.xephi.authme.security.crypts; import fr.xephi.authme.security.crypts.description.Recommendation; import fr.xephi.authme.security.crypts.description.Usage; +import java.util.Locale; + import static fr.xephi.authme.security.HashUtils.isEqual; @Recommendation(Usage.RECOMMENDED) @@ -19,7 +21,7 @@ public class XAuth extends HexSaltedMethod { @Override public String computeHash(String password, String salt, String name) { - String hash = getWhirlpool(salt + password).toLowerCase(); + String hash = getWhirlpool(salt + password).toLowerCase(Locale.ROOT); int saltPos = password.length() >= hash.length() ? hash.length() - 1 : password.length(); return hash.substring(0, saltPos) + salt + hash.substring(saltPos); } diff --git a/src/main/java/fr/xephi/authme/security/totp/GenerateTotpService.java b/src/main/java/fr/xephi/authme/security/totp/GenerateTotpService.java index 3d00f78a..8c689dde 100644 --- a/src/main/java/fr/xephi/authme/security/totp/GenerateTotpService.java +++ b/src/main/java/fr/xephi/authme/security/totp/GenerateTotpService.java @@ -6,6 +6,7 @@ import fr.xephi.authme.util.expiring.ExpiringMap; import org.bukkit.entity.Player; import javax.inject.Inject; +import java.util.Locale; import java.util.concurrent.TimeUnit; /** @@ -32,7 +33,7 @@ public class GenerateTotpService implements HasCleanup { */ public TotpGenerationResult generateTotpKey(Player player) { TotpGenerationResult credentials = totpAuthenticator.generateTotpKey(player); - totpKeys.put(player.getName().toLowerCase(), credentials); + totpKeys.put(player.getName().toLowerCase(Locale.ROOT), credentials); return credentials; } @@ -43,11 +44,11 @@ public class GenerateTotpService implements HasCleanup { * @return TOTP generation result */ public TotpGenerationResult getGeneratedTotpKey(Player player) { - return totpKeys.get(player.getName().toLowerCase()); + return totpKeys.get(player.getName().toLowerCase(Locale.ROOT)); } public void removeGenerateTotpKey(Player player) { - totpKeys.remove(player.getName().toLowerCase()); + totpKeys.remove(player.getName().toLowerCase(Locale.ROOT)); } /** @@ -58,7 +59,7 @@ public class GenerateTotpService implements HasCleanup { * @return true if the input code is correct, false if the code is invalid or no unexpired totp key is available */ public boolean isTotpCodeCorrectForGeneratedTotpKey(Player player, String totpCode) { - TotpGenerationResult totpDetails = totpKeys.get(player.getName().toLowerCase()); + TotpGenerationResult totpDetails = totpKeys.get(player.getName().toLowerCase(Locale.ROOT)); return totpDetails != null && totpAuthenticator.checkCode(player.getName(), totpDetails.getTotpKey(), totpCode); } diff --git a/src/main/java/fr/xephi/authme/security/totp/TotpAuthenticator.java b/src/main/java/fr/xephi/authme/security/totp/TotpAuthenticator.java index e26b136f..950a6ff7 100644 --- a/src/main/java/fr/xephi/authme/security/totp/TotpAuthenticator.java +++ b/src/main/java/fr/xephi/authme/security/totp/TotpAuthenticator.java @@ -15,6 +15,8 @@ import org.bukkit.entity.Player; import javax.inject.Inject; +import java.util.Locale; + import static fr.xephi.authme.util.Utils.MILLIS_PER_MINUTE; /** @@ -54,7 +56,7 @@ public class TotpAuthenticator implements HasCleanup { * @return true if code is valid, false otherwise */ public boolean checkCode(String playerName, String totpKey, String inputCode) { - String nameLower = playerName.toLowerCase(); + String nameLower = playerName.toLowerCase(Locale.ROOT); Integer totpCode = Ints.tryParse(inputCode); if (totpCode != null && !usedCodes.contains(nameLower, totpCode) && authenticator.authorize(totpKey, totpCode)) { diff --git a/src/main/java/fr/xephi/authme/service/AntiBotService.java b/src/main/java/fr/xephi/authme/service/AntiBotService.java index fbc19e8b..c5fb136d 100644 --- a/src/main/java/fr/xephi/authme/service/AntiBotService.java +++ b/src/main/java/fr/xephi/authme/service/AntiBotService.java @@ -11,6 +11,7 @@ import fr.xephi.authme.util.AtomicIntervalCounter; import org.bukkit.scheduler.BukkitTask; import javax.inject.Inject; +import java.util.Locale; import java.util.concurrent.CopyOnWriteArrayList; import static fr.xephi.authme.service.BukkitService.TICKS_PER_MINUTE; @@ -176,7 +177,7 @@ public class AntiBotService implements SettingsDependent { * @return true if the given name has been kicked because of Antibot */ public boolean wasPlayerKicked(String name) { - return antibotKicked.contains(name.toLowerCase()); + return antibotKicked.contains(name.toLowerCase(Locale.ROOT)); } /** @@ -186,7 +187,7 @@ public class AntiBotService implements SettingsDependent { * @param name the name to add */ public void addPlayerKick(String name) { - antibotKicked.addIfAbsent(name.toLowerCase()); + antibotKicked.addIfAbsent(name.toLowerCase(Locale.ROOT)); } public enum AntiBotStatus { diff --git a/src/main/java/fr/xephi/authme/service/BackupService.java b/src/main/java/fr/xephi/authme/service/BackupService.java index 2e72a7b0..291581b3 100644 --- a/src/main/java/fr/xephi/authme/service/BackupService.java +++ b/src/main/java/fr/xephi/authme/service/BackupService.java @@ -18,6 +18,7 @@ import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; +import java.util.Locale; import static fr.xephi.authme.util.Utils.logAndSendMessage; import static fr.xephi.authme.util.Utils.logAndSendWarning; @@ -151,7 +152,7 @@ public class BackupService { * @return True if the path is correct, false if it is incorrect or the OS is not Windows */ private boolean useWindowsCommand(String windowsPath) { - String isWin = System.getProperty("os.name").toLowerCase(); + String isWin = System.getProperty("os.name").toLowerCase(Locale.ROOT); if (isWin.contains("win")) { if (new File(windowsPath + "\\bin\\mysqldump.exe").exists()) { return true; diff --git a/src/main/java/fr/xephi/authme/service/PasswordRecoveryService.java b/src/main/java/fr/xephi/authme/service/PasswordRecoveryService.java index 20a78d7f..78c5ee62 100644 --- a/src/main/java/fr/xephi/authme/service/PasswordRecoveryService.java +++ b/src/main/java/fr/xephi/authme/service/PasswordRecoveryService.java @@ -20,6 +20,7 @@ import org.bukkit.entity.Player; import javax.annotation.PostConstruct; import javax.inject.Inject; +import java.util.Locale; import java.util.concurrent.TimeUnit; import static fr.xephi.authme.settings.properties.EmailSettings.RECOVERY_PASSWORD_LENGTH; @@ -76,7 +77,7 @@ public class PasswordRecoveryService implements Reloadable, HasCleanup { boolean couldSendMail = emailService.sendRecoveryCode(player.getName(), email, recoveryCode); if (couldSendMail) { commonService.send(player, MessageKey.RECOVERY_CODE_SENT); - emailCooldown.add(player.getName().toLowerCase()); + emailCooldown.add(player.getName().toLowerCase(Locale.ROOT)); } else { commonService.send(player, MessageKey.EMAIL_SEND_FAILURE); } @@ -104,7 +105,7 @@ public class PasswordRecoveryService implements Reloadable, HasCleanup { boolean couldSendMail = emailService.sendPasswordMail(name, email, thePass); if (couldSendMail) { commonService.send(player, MessageKey.RECOVERY_EMAIL_SENT_MESSAGE); - emailCooldown.add(player.getName().toLowerCase()); + emailCooldown.add(player.getName().toLowerCase(Locale.ROOT)); } else { commonService.send(player, MessageKey.EMAIL_SEND_FAILURE); } @@ -141,7 +142,7 @@ public class PasswordRecoveryService implements Reloadable, HasCleanup { * @return True if the player is not on cooldown. */ private boolean checkEmailCooldown(Player player) { - Duration waitDuration = emailCooldown.getExpiration(player.getName().toLowerCase()); + Duration waitDuration = emailCooldown.getExpiration(player.getName().toLowerCase(Locale.ROOT)); if (waitDuration.getDuration() > 0) { String durationText = messages.formatDuration(waitDuration); messages.send(player, MessageKey.EMAIL_COOLDOWN_ERROR, durationText); diff --git a/src/main/java/fr/xephi/authme/service/ValidationService.java b/src/main/java/fr/xephi/authme/service/ValidationService.java index 183a3b4a..536d2111 100644 --- a/src/main/java/fr/xephi/authme/service/ValidationService.java +++ b/src/main/java/fr/xephi/authme/service/ValidationService.java @@ -25,6 +25,7 @@ import javax.annotation.PostConstruct; import javax.inject.Inject; import java.util.Collection; import java.util.List; +import java.util.Locale; import java.util.Set; import java.util.regex.Pattern; @@ -69,7 +70,7 @@ public class ValidationService implements Reloadable { * @return the validation result */ public ValidationResult validatePassword(String password, String username) { - String passLow = password.toLowerCase(); + String passLow = password.toLowerCase(Locale.ROOT); if (!passwordRegex.matcher(passLow).matches()) { return new ValidationResult(MessageKey.PASSWORD_CHARACTERS_ERROR, passwordRegex.pattern()); } else if (passLow.equalsIgnoreCase(username)) { @@ -139,7 +140,7 @@ public class ValidationService implements Reloadable { * @return true if unrestricted, false otherwise */ public boolean isUnrestricted(String name) { - return settings.getProperty(RestrictionSettings.UNRESTRICTED_NAMES).contains(name.toLowerCase()); + return settings.getProperty(RestrictionSettings.UNRESTRICTED_NAMES).contains(name.toLowerCase(Locale.ROOT)); } /** @@ -149,7 +150,7 @@ public class ValidationService implements Reloadable { * @return true if the player may join, false if the player does not satisfy the name restrictions */ public boolean fulfillsNameRestrictions(Player player) { - Collection restrictions = restrictedNames.get(player.getName().toLowerCase()); + Collection restrictions = restrictedNames.get(player.getName().toLowerCase(Locale.ROOT)); if (Utils.isCollectionEmpty(restrictions)) { return true; } @@ -212,7 +213,7 @@ public class ValidationService implements Reloadable { for (String restriction : configuredRestrictions) { if (isInsideString(';', restriction)) { String[] data = restriction.split(";"); - restrictions.put(data[0].toLowerCase(), data[1]); + restrictions.put(data[0].toLowerCase(Locale.ROOT), data[1]); } else { logger.warning("Restricted user rule must have a ';' separating name from restriction," + " but found: '" + restriction + "'"); diff --git a/src/main/java/fr/xephi/authme/service/bungeecord/BungeeSender.java b/src/main/java/fr/xephi/authme/service/bungeecord/BungeeSender.java index d4a9f7ef..3d43605b 100644 --- a/src/main/java/fr/xephi/authme/service/bungeecord/BungeeSender.java +++ b/src/main/java/fr/xephi/authme/service/bungeecord/BungeeSender.java @@ -13,6 +13,7 @@ import org.bukkit.entity.Player; import org.bukkit.plugin.messaging.Messenger; import javax.inject.Inject; +import java.util.Locale; public class BungeeSender implements SettingsDependent { @@ -103,9 +104,9 @@ public class BungeeSender implements SettingsDependent { return; } if (type.isBroadcast()) { - sendForwardedBungeecordMessage(player, "AuthMe.v2.Broadcast", type.getId(), player.getName().toLowerCase()); + sendForwardedBungeecordMessage(player, "AuthMe.v2.Broadcast", type.getId(), player.getName().toLowerCase(Locale.ROOT)); } else { - sendBungeecordMessage(player, "AuthMe.v2", type.getId(), player.getName().toLowerCase()); + sendBungeecordMessage(player, "AuthMe.v2", type.getId(), player.getName().toLowerCase(Locale.ROOT)); } } diff --git a/src/main/java/fr/xephi/authme/settings/SpawnLoader.java b/src/main/java/fr/xephi/authme/settings/SpawnLoader.java index 2103f9bd..6a8b7fa7 100644 --- a/src/main/java/fr/xephi/authme/settings/SpawnLoader.java +++ b/src/main/java/fr/xephi/authme/settings/SpawnLoader.java @@ -19,6 +19,7 @@ import org.bukkit.entity.Player; import javax.inject.Inject; import java.io.File; import java.io.IOException; +import java.util.Locale; /** * Manager for spawn points. It loads spawn definitions from AuthMe and third-party plugins @@ -177,7 +178,7 @@ public class SpawnLoader implements Reloadable { World world = player.getWorld(); Location spawnLoc = null; for (String priority : spawnPriority) { - switch (priority.toLowerCase().trim()) { + switch (priority.toLowerCase(Locale.ROOT).trim()) { case "default": if (world.getSpawnLocation() != null) { if (!isValidSpawnPoint(world.getSpawnLocation())) { diff --git a/src/main/java/fr/xephi/authme/task/purge/PurgeExecutor.java b/src/main/java/fr/xephi/authme/task/purge/PurgeExecutor.java index 399ff398..ea009604 100644 --- a/src/main/java/fr/xephi/authme/task/purge/PurgeExecutor.java +++ b/src/main/java/fr/xephi/authme/task/purge/PurgeExecutor.java @@ -15,6 +15,7 @@ import org.bukkit.Server; import javax.inject.Inject; import java.io.File; import java.util.Collection; +import java.util.Locale; import static fr.xephi.authme.util.FileUtils.makePath; @@ -80,7 +81,7 @@ public class PurgeExecutor { } for (String file : dataFolder.list()) { - if (cleared.contains(file.toLowerCase())) { + if (cleared.contains(file.toLowerCase(Locale.ROOT))) { File playerFile = new File(dataFolder, file); if (playerFile.exists() && playerFile.delete()) { i++; @@ -137,7 +138,7 @@ public class PurgeExecutor { if (name.equals(file)) { continue; } - if (cleared.contains(name.toLowerCase())) { + if (cleared.contains(name.toLowerCase(Locale.ROOT))) { File dataFile = new File(dataFolder, file); if (dataFile.exists() && dataFile.delete()) { i++; 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 f29d6f71..5c4a8707 100644 --- a/src/main/java/fr/xephi/authme/task/purge/PurgeTask.java +++ b/src/main/java/fr/xephi/authme/task/purge/PurgeTask.java @@ -12,6 +12,7 @@ import org.bukkit.entity.Player; import org.bukkit.scheduler.BukkitRunnable; import java.util.HashSet; +import java.util.Locale; import java.util.Set; import java.util.UUID; @@ -74,7 +75,7 @@ class PurgeTask extends BukkitRunnable { } OfflinePlayer offlinePlayer = offlinePlayers[nextPosition]; - if (offlinePlayer.getName() != null && toPurge.remove(offlinePlayer.getName().toLowerCase())) { + if (offlinePlayer.getName() != null && toPurge.remove(offlinePlayer.getName().toLowerCase(Locale.ROOT))) { if (!permissionsManager.loadUserData(offlinePlayer)) { logger.warning("Unable to check if the user " + offlinePlayer.getName() + " can be purged!"); continue; diff --git a/src/test/java/fr/xephi/authme/api/v3/AuthMeApiTest.java b/src/test/java/fr/xephi/authme/api/v3/AuthMeApiTest.java index b3fd0158..b52f7908 100644 --- a/src/test/java/fr/xephi/authme/api/v3/AuthMeApiTest.java +++ b/src/test/java/fr/xephi/authme/api/v3/AuthMeApiTest.java @@ -28,6 +28,7 @@ import java.time.Instant; import java.util.Arrays; import java.util.Date; import java.util.List; +import java.util.Locale; import java.util.Optional; import java.util.stream.Collectors; @@ -457,7 +458,7 @@ public class AuthMeApiTest { String name = "Marco"; String password = "myP4ss"; HashedPassword hashedPassword = new HashedPassword("0395872SLKDFJOWEIUTEJSD"); - given(passwordSecurity.computeHash(password, name.toLowerCase())).willReturn(hashedPassword); + given(passwordSecurity.computeHash(password, name.toLowerCase(Locale.ROOT))).willReturn(hashedPassword); given(dataSource.saveAuth(any(PlayerAuth.class))).willReturn(true); // when @@ -465,10 +466,10 @@ public class AuthMeApiTest { // then assertThat(result, equalTo(true)); - verify(passwordSecurity).computeHash(password, name.toLowerCase()); + verify(passwordSecurity).computeHash(password, name.toLowerCase(Locale.ROOT)); ArgumentCaptor authCaptor = ArgumentCaptor.forClass(PlayerAuth.class); verify(dataSource).saveAuth(authCaptor.capture()); - assertThat(authCaptor.getValue().getNickname(), equalTo(name.toLowerCase())); + assertThat(authCaptor.getValue().getNickname(), equalTo(name.toLowerCase(Locale.ROOT))); assertThat(authCaptor.getValue().getRealName(), equalTo(name)); assertThat(authCaptor.getValue().getPassword(), equalTo(hashedPassword)); } diff --git a/src/test/java/fr/xephi/authme/command/CommandInitializerTest.java b/src/test/java/fr/xephi/authme/command/CommandInitializerTest.java index 133d0194..964192f3 100644 --- a/src/test/java/fr/xephi/authme/command/CommandInitializerTest.java +++ b/src/test/java/fr/xephi/authme/command/CommandInitializerTest.java @@ -9,6 +9,7 @@ import java.util.Collection; import java.util.HashMap; import java.util.HashSet; import java.util.List; +import java.util.Locale; import java.util.Map; import java.util.Set; import java.util.function.BiConsumer; @@ -90,7 +91,7 @@ public class CommandInitializerTest { @Override public void accept(CommandDescription command, Integer depth) { for (String label : command.getLabels()) { - if (!label.equals(label.toLowerCase())) { + if (!label.equals(label.toLowerCase(Locale.ROOT))) { fail("Label '" + label + "' should be lowercase"); } else if (invalidPattern.matcher(label).matches()) { fail("Label '" + label + "' has whitespace"); diff --git a/src/test/java/fr/xephi/authme/command/executable/authme/ConverterCommandTest.java b/src/test/java/fr/xephi/authme/command/executable/authme/ConverterCommandTest.java index 43c1c906..22533acd 100644 --- a/src/test/java/fr/xephi/authme/command/executable/authme/ConverterCommandTest.java +++ b/src/test/java/fr/xephi/authme/command/executable/authme/ConverterCommandTest.java @@ -17,6 +17,7 @@ import org.mockito.junit.MockitoJUnitRunner; import java.util.Collections; import java.util.HashSet; +import java.util.Locale; import java.util.Map; import java.util.Set; @@ -129,7 +130,7 @@ public class ConverterCommandTest { setBukkitServiceToRunTaskAsynchronously(bukkitService); // when - command.executeCommand(sender, Collections.singletonList(converterName.toUpperCase())); + command.executeCommand(sender, Collections.singletonList(converterName.toUpperCase(Locale.ROOT))); // then verify(converter).execute(sender); diff --git a/src/test/java/fr/xephi/authme/command/executable/authme/PurgeBannedPlayersCommandTest.java b/src/test/java/fr/xephi/authme/command/executable/authme/PurgeBannedPlayersCommandTest.java index 199044cb..7c675bc0 100644 --- a/src/test/java/fr/xephi/authme/command/executable/authme/PurgeBannedPlayersCommandTest.java +++ b/src/test/java/fr/xephi/authme/command/executable/authme/PurgeBannedPlayersCommandTest.java @@ -12,6 +12,7 @@ import org.mockito.junit.MockitoJUnitRunner; import java.util.Collections; import java.util.HashSet; +import java.util.Locale; import java.util.Set; import static com.google.common.collect.Sets.newHashSet; @@ -67,7 +68,7 @@ public class PurgeBannedPlayersCommandTest { private static Set asLowerCaseSet(String... items) { Set result = new HashSet<>(items.length); for (String item : items) { - result.add(item.toLowerCase()); + result.add(item.toLowerCase(Locale.ROOT)); } return result; } diff --git a/src/test/java/fr/xephi/authme/command/executable/authme/PurgePlayerCommandTest.java b/src/test/java/fr/xephi/authme/command/executable/authme/PurgePlayerCommandTest.java index 846c4cab..cf48d2a3 100644 --- a/src/test/java/fr/xephi/authme/command/executable/authme/PurgePlayerCommandTest.java +++ b/src/test/java/fr/xephi/authme/command/executable/authme/PurgePlayerCommandTest.java @@ -11,6 +11,8 @@ import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.junit.MockitoJUnitRunner; +import java.util.Locale; + import static fr.xephi.authme.service.BukkitServiceTestHelper.setBukkitServiceToRunTaskAsynchronously; import static fr.xephi.authme.service.BukkitServiceTestHelper.setBukkitServiceToRunTaskOptionallyAsync; import static java.util.Arrays.asList; @@ -71,7 +73,7 @@ public class PurgePlayerCommandTest { // then verify(dataSource).isAuthAvailable(name); - verify(purgeExecutor).executePurge(singletonList(player), singletonList(name.toLowerCase())); + verify(purgeExecutor).executePurge(singletonList(player), singletonList(name.toLowerCase(Locale.ROOT))); } @Test @@ -87,6 +89,6 @@ public class PurgePlayerCommandTest { command.executeCommand(sender, asList(name, "force")); // then - verify(purgeExecutor).executePurge(singletonList(player), singletonList(name.toLowerCase())); + verify(purgeExecutor).executePurge(singletonList(player), singletonList(name.toLowerCase(Locale.ROOT))); } } diff --git a/src/test/java/fr/xephi/authme/command/executable/authme/RegisterAdminCommandTest.java b/src/test/java/fr/xephi/authme/command/executable/authme/RegisterAdminCommandTest.java index 92492b99..07808fa5 100644 --- a/src/test/java/fr/xephi/authme/command/executable/authme/RegisterAdminCommandTest.java +++ b/src/test/java/fr/xephi/authme/command/executable/authme/RegisterAdminCommandTest.java @@ -21,6 +21,7 @@ import org.mockito.Mock; import org.mockito.junit.MockitoJUnitRunner; import java.util.Arrays; +import java.util.Locale; import static fr.xephi.authme.service.BukkitServiceTestHelper.setBukkitServiceToRunTaskOptionallyAsync; import static fr.xephi.authme.service.BukkitServiceTestHelper.setBukkitServiceToScheduleSyncTaskFromOptionallyAsyncTask; @@ -179,7 +180,7 @@ public class RegisterAdminCommandTest { private void assertAuthHasInfo(PlayerAuth auth, String name, HashedPassword hashedPassword) { assertThat(auth.getRealName(), equalTo(name)); - assertThat(auth.getNickname(), equalTo(name.toLowerCase())); + assertThat(auth.getNickname(), equalTo(name.toLowerCase(Locale.ROOT))); assertThat(auth.getPassword(), equalTo(hashedPassword)); } } diff --git a/src/test/java/fr/xephi/authme/command/executable/authme/debug/DebugCommandTest.java b/src/test/java/fr/xephi/authme/command/executable/authme/debug/DebugCommandTest.java index e2c63a60..82e39d41 100644 --- a/src/test/java/fr/xephi/authme/command/executable/authme/debug/DebugCommandTest.java +++ b/src/test/java/fr/xephi/authme/command/executable/authme/debug/DebugCommandTest.java @@ -16,6 +16,7 @@ import org.mockito.junit.MockitoJUnitRunner; import java.util.Arrays; import java.util.List; +import java.util.Locale; import static com.google.common.base.Preconditions.checkArgument; import static java.util.Collections.emptyList; @@ -125,7 +126,7 @@ public class DebugCommandTest { CommandSender sender = mock(CommandSender.class); given(permissionsManager.hasPermission(sender, section.getRequiredPermission())).willReturn(true); - List arguments = Arrays.asList(section.getName().toUpperCase(), "test", "toast"); + List arguments = Arrays.asList(section.getName().toUpperCase(Locale.ROOT), "test", "toast"); // when command.executeCommand(sender, arguments); @@ -144,7 +145,7 @@ public class DebugCommandTest { CommandSender sender = mock(CommandSender.class); given(permissionsManager.hasPermission(sender, section.getRequiredPermission())).willReturn(false); - List arguments = Arrays.asList(section.getName().toUpperCase(), "test"); + List arguments = Arrays.asList(section.getName().toUpperCase(Locale.ROOT), "test"); // when command.executeCommand(sender, arguments); diff --git a/src/test/java/fr/xephi/authme/command/executable/email/RecoverEmailCommandTest.java b/src/test/java/fr/xephi/authme/command/executable/email/RecoverEmailCommandTest.java index 4e629d6d..06ce4ee5 100644 --- a/src/test/java/fr/xephi/authme/command/executable/email/RecoverEmailCommandTest.java +++ b/src/test/java/fr/xephi/authme/command/executable/email/RecoverEmailCommandTest.java @@ -22,6 +22,7 @@ import org.junit.runner.RunWith; import org.mockito.Mock; import java.util.Collections; +import java.util.Locale; import static fr.xephi.authme.service.BukkitServiceTestHelper.setBukkitServiceToRunTaskAsynchronously; import static org.hamcrest.Matchers.equalTo; @@ -187,7 +188,7 @@ public class RecoverEmailCommandTest { setBukkitServiceToRunTaskAsynchronously(bukkitService); // when - command.executeCommand(sender, Collections.singletonList(email.toUpperCase())); + command.executeCommand(sender, Collections.singletonList(email.toUpperCase(Locale.ROOT))); // then verify(emailService).hasAllInformation(); diff --git a/src/test/java/fr/xephi/authme/command/help/HelpProviderTest.java b/src/test/java/fr/xephi/authme/command/help/HelpProviderTest.java index 99ec921c..8852387f 100644 --- a/src/test/java/fr/xephi/authme/command/help/HelpProviderTest.java +++ b/src/test/java/fr/xephi/authme/command/help/HelpProviderTest.java @@ -23,6 +23,7 @@ import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.List; +import java.util.Locale; import java.util.stream.Collectors; import static fr.xephi.authme.command.TestCommandsUtil.getCommandWithLabel; @@ -446,19 +447,19 @@ public class HelpProviderTest { given(helpMessagesService.buildLocalizedDescription(any(CommandDescription.class))) .willAnswer(new ReturnsArgumentAt(0)); for (HelpMessage key : HelpMessage.values()) { - String text = key.name().replace("_", " ").toLowerCase(); + String text = key.name().replace("_", " ").toLowerCase(Locale.ROOT); given(helpMessagesService.getMessage(key)) - .willReturn(text.substring(0, 1).toUpperCase() + text.substring(1)); + .willReturn(text.substring(0, 1).toUpperCase(Locale.ROOT) + text.substring(1)); } for (DefaultPermission permission : DefaultPermission.values()) { - String text = permission.name().replace("_", " ").toLowerCase(); + String text = permission.name().replace("_", " ").toLowerCase(Locale.ROOT); given(helpMessagesService.getMessage(permission)) - .willReturn(text.substring(0, 1).toUpperCase() + text.substring(1)); + .willReturn(text.substring(0, 1).toUpperCase(Locale.ROOT) + text.substring(1)); } for (HelpSection section : HelpSection.values()) { - String text = section.name().replace("_", " ").toLowerCase(); + String text = section.name().replace("_", " ").toLowerCase(Locale.ROOT); given(helpMessagesService.getMessage(section)) - .willReturn(text.substring(0, 1).toUpperCase() + text.substring(1)); + .willReturn(text.substring(0, 1).toUpperCase(Locale.ROOT) + text.substring(1)); } } diff --git a/src/test/java/fr/xephi/authme/data/captcha/LoginCaptchaManagerTest.java b/src/test/java/fr/xephi/authme/data/captcha/LoginCaptchaManagerTest.java index e5c2c63f..31976345 100644 --- a/src/test/java/fr/xephi/authme/data/captcha/LoginCaptchaManagerTest.java +++ b/src/test/java/fr/xephi/authme/data/captcha/LoginCaptchaManagerTest.java @@ -7,6 +7,8 @@ import fr.xephi.authme.util.expiring.TimedCounter; import org.bukkit.entity.Player; import org.junit.Test; +import java.util.Locale; + import static fr.xephi.authme.AuthMeMatchers.stringWithLength; import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.not; @@ -34,7 +36,7 @@ public class LoginCaptchaManagerTest { // then assertThat(manager.isCaptchaRequired(player), equalTo(false)); manager.increaseLoginFailureCount(player); - assertThat(manager.isCaptchaRequired(player.toUpperCase()), equalTo(true)); + assertThat(manager.isCaptchaRequired(player.toUpperCase(Locale.ROOT)), equalTo(true)); assertThat(manager.isCaptchaRequired("otherPlayer"), equalTo(false)); } @@ -167,6 +169,6 @@ public class LoginCaptchaManagerTest { private static void assertHasCount(LoginCaptchaManager manager, String player, Integer count) { TimedCounter playerCounts = ReflectionTestUtils .getFieldValue(LoginCaptchaManager.class, manager, "playerCounts"); - assertThat(playerCounts.get(player.toLowerCase()), equalTo(count)); + assertThat(playerCounts.get(player.toLowerCase(Locale.ROOT)), equalTo(count)); } } diff --git a/src/test/java/fr/xephi/authme/security/PasswordSecurityTest.java b/src/test/java/fr/xephi/authme/security/PasswordSecurityTest.java index 520ae8dd..aa3165e7 100644 --- a/src/test/java/fr/xephi/authme/security/PasswordSecurityTest.java +++ b/src/test/java/fr/xephi/authme/security/PasswordSecurityTest.java @@ -27,6 +27,7 @@ import org.mockito.invocation.InvocationOnMock; import org.mockito.stubbing.Answer; import java.util.Collections; +import java.util.Locale; import java.util.Set; import static com.google.common.collect.Sets.newHashSet; @@ -118,7 +119,7 @@ public class PasswordSecurityTest { HashedPassword password = new HashedPassword("$TEST$10$SOME_HASH", null); String playerName = "Tester"; // Calls to EncryptionMethod are always with the lower-case version of the name - String playerLowerCase = playerName.toLowerCase(); + String playerLowerCase = playerName.toLowerCase(Locale.ROOT); String clearTextPass = "myPassTest"; given(dataSource.getPassword(playerName)).willReturn(password); @@ -139,7 +140,7 @@ public class PasswordSecurityTest { // given HashedPassword password = new HashedPassword("$TEST$10$SOME_HASH", null); String playerName = "My_PLayer"; - String playerLowerCase = playerName.toLowerCase(); + String playerLowerCase = playerName.toLowerCase(Locale.ROOT); String clearTextPass = "passw0Rd1"; given(dataSource.getPassword(playerName)).willReturn(password); @@ -178,7 +179,7 @@ public class PasswordSecurityTest { HashedPassword password = new HashedPassword("$2y$10$2e6d2193f43501c926e25elvWlPmWczmrfrnbZV0dUZGITjYjnkkW"); String playerName = "somePlayer"; - String playerLowerCase = playerName.toLowerCase(); + String playerLowerCase = playerName.toLowerCase(Locale.ROOT); String clearTextPass = "Test"; // MD5 hash for "Test" HashedPassword newPassword = new HashedPassword("0cbc6611f5540bd0809a388dc95a615b"); @@ -230,7 +231,7 @@ public class PasswordSecurityTest { // given String password = "MyP@ssword"; String username = "theUserInTest"; - String usernameLowerCase = username.toLowerCase(); + String usernameLowerCase = username.toLowerCase(Locale.ROOT); HashedPassword hashedPassword = new HashedPassword("$T$est#Hash", "__someSalt__"); given(method.computeHash(password, usernameLowerCase)).willReturn(hashedPassword); given(settings.getProperty(SecuritySettings.PASSWORD_HASH)).willReturn(HashAlgorithm.JOOMLA); diff --git a/src/test/java/fr/xephi/authme/security/crypts/AbstractEncryptionMethodTest.java b/src/test/java/fr/xephi/authme/security/crypts/AbstractEncryptionMethodTest.java index b42cd926..6a96425f 100644 --- a/src/test/java/fr/xephi/authme/security/crypts/AbstractEncryptionMethodTest.java +++ b/src/test/java/fr/xephi/authme/security/crypts/AbstractEncryptionMethodTest.java @@ -8,6 +8,7 @@ import org.junit.BeforeClass; import org.junit.Test; import java.util.List; +import java.util.Locale; import java.util.Map; import static org.hamcrest.Matchers.equalTo; @@ -154,13 +155,13 @@ public abstract class AbstractEncryptionMethodTest { method.comparePassword(password, hashedPassword, USERNAME)); assumeThat(SKIP_LONG_TESTS, equalTo(false)); - if (!password.equals(password.toLowerCase())) { + if (!password.equals(password.toLowerCase(Locale.ROOT))) { assertFalse("Lower-case of '" + password + "' should not match generated hash '" + hash + "'", - method.comparePassword(password.toLowerCase(), hashedPassword, USERNAME)); + method.comparePassword(password.toLowerCase(Locale.ROOT), hashedPassword, USERNAME)); } - if (!password.equals(password.toUpperCase())) { + if (!password.equals(password.toUpperCase(Locale.ROOT))) { assertFalse("Upper-case of '" + password + "' should not match generated hash '" + hash + "'", - method.comparePassword(password.toUpperCase(), hashedPassword, USERNAME)); + method.comparePassword(password.toUpperCase(Locale.ROOT), hashedPassword, USERNAME)); } } } diff --git a/src/test/java/fr/xephi/authme/service/MigrationServiceTest.java b/src/test/java/fr/xephi/authme/service/MigrationServiceTest.java index e1579710..ec989a04 100644 --- a/src/test/java/fr/xephi/authme/service/MigrationServiceTest.java +++ b/src/test/java/fr/xephi/authme/service/MigrationServiceTest.java @@ -15,6 +15,7 @@ import org.mockito.Mock; import org.mockito.junit.MockitoJUnitRunner; import java.util.Arrays; +import java.util.Locale; import static fr.xephi.authme.AuthMeMatchers.equalToHash; import static org.hamcrest.Matchers.equalToIgnoringCase; @@ -118,7 +119,7 @@ public class MigrationServiceTest { private static void setSha256MockToUppercase(Sha256 sha256) { given(sha256.computeHash(anyString(), anyString())).willAnswer(invocation -> { String plainPassword = invocation.getArgument(0); - return new HashedPassword(plainPassword.toUpperCase(), null); + return new HashedPassword(plainPassword.toUpperCase(Locale.ROOT), null); }); } } diff --git a/src/test/java/tools/docs/hashmethods/HashAlgorithmsDescriptionTask.java b/src/test/java/tools/docs/hashmethods/HashAlgorithmsDescriptionTask.java index b21d7fda..2fd23415 100644 --- a/src/test/java/tools/docs/hashmethods/HashAlgorithmsDescriptionTask.java +++ b/src/test/java/tools/docs/hashmethods/HashAlgorithmsDescriptionTask.java @@ -7,6 +7,7 @@ import tools.utils.TagValue.NestedTagValue; import tools.utils.TagValueHolder; import tools.utils.ToolsConstants; +import java.util.Locale; import java.util.Map; /** @@ -83,7 +84,7 @@ public class HashAlgorithmsDescriptionTask implements AutoToolTask { // Get the enum name and replace something like "DO_NOT_USE" to "Do not use" String enumName = value.toString().replace("_", " "); return enumName.length() > 2 - ? enumName.substring(0, 1) + enumName.substring(1).toLowerCase() + ? enumName.substring(0, 1) + enumName.substring(1).toLowerCase(Locale.ROOT) : enumName; }