Always specify Locale on toLowerCase and toUpperCase usages, fixes AuthMe not working correctly on machines with turkish locale. ('I'.toLowerCase() => 'ı')

This commit is contained in:
Gabriele C 2022-08-20 04:41:04 +02:00
parent c38e2aba28
commit 75b3a571e1
67 changed files with 217 additions and 143 deletions

View File

@ -21,6 +21,7 @@ import java.time.Instant;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
import java.util.Locale;
import java.util.Optional; import java.util.Optional;
/** /**
@ -217,7 +218,7 @@ public class AuthMeApi {
* @return true if player is registered, false otherwise * @return true if player is registered, false otherwise
*/ */
public boolean isRegistered(String playerName) { public boolean isRegistered(String playerName) {
String player = playerName.toLowerCase(); String player = playerName.toLowerCase(Locale.ROOT);
return dataSource.isAuthAvailable(player); return dataSource.isAuthAvailable(player);
} }
@ -241,7 +242,7 @@ public class AuthMeApi {
* @return true if the player was registered successfully * @return true if the player was registered successfully
*/ */
public boolean registerPlayer(String playerName, String password) { public boolean registerPlayer(String playerName, String password) {
String name = playerName.toLowerCase(); String name = playerName.toLowerCase(Locale.ROOT);
if (isRegistered(name)) { if (isRegistered(name)) {
return false; return false;
} }

View File

@ -11,6 +11,7 @@ import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.HashSet; import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Locale;
import java.util.Set; import java.util.Set;
import static fr.xephi.authme.command.FoundResultStatus.INCORRECT_ARGUMENTS; import static fr.xephi.authme.command.FoundResultStatus.INCORRECT_ARGUMENTS;
@ -130,7 +131,7 @@ public class CommandMapper {
} }
private CommandDescription getBaseCommand(String label) { private CommandDescription getBaseCommand(String label) {
String baseLabel = label.toLowerCase(); String baseLabel = label.toLowerCase(Locale.ROOT);
if (baseLabel.startsWith("authme:")) { if (baseLabel.startsWith("authme:")) {
baseLabel = baseLabel.substring("authme:".length()); baseLabel = baseLabel.substring("authme:".length());
} }
@ -157,7 +158,7 @@ public class CommandMapper {
return null; return null;
} }
final String label = parts.get(0).toLowerCase(); final String label = parts.get(0).toLowerCase(Locale.ROOT);
final int argumentCount = parts.size() - 1; final int argumentCount = parts.size() - 1;
for (CommandDescription child : baseCommand.getChildren()) { for (CommandDescription child : baseCommand.getChildren()) {

View File

@ -10,6 +10,7 @@ import org.bukkit.command.CommandSender;
import javax.inject.Inject; import javax.inject.Inject;
import java.util.List; 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. * 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 { } else {
bukkitService.runTaskAsynchronously(() -> { bukkitService.runTaskAsynchronously(() -> {
PlayerAuth auth = dataSource.getAuth(playerName.toLowerCase()); PlayerAuth auth = dataSource.getAuth(playerName.toLowerCase(Locale.ROOT));
if (auth == null) { if (auth == null) {
commonService.send(sender, MessageKey.UNKNOWN_USER); commonService.send(sender, MessageKey.UNKNOWN_USER);
return; return;

View File

@ -22,6 +22,7 @@ import org.bukkit.command.CommandSender;
import javax.inject.Inject; import javax.inject.Inject;
import java.util.List; import java.util.List;
import java.util.Locale;
import java.util.Map; import java.util.Map;
/** /**
@ -71,7 +72,7 @@ public class ConverterCommand implements ExecutableCommand {
private static Class<? extends Converter> getConverterClassFromArgs(List<String> arguments) { private static Class<? extends Converter> getConverterClassFromArgs(List<String> arguments) {
return arguments.isEmpty() return arguments.isEmpty()
? null ? null
: CONVERTERS.get(arguments.get(0).toLowerCase()); : CONVERTERS.get(arguments.get(0).toLowerCase(Locale.ROOT));
} }
/** /**

View File

@ -9,6 +9,7 @@ import org.bukkit.command.CommandSender;
import javax.inject.Inject; import javax.inject.Inject;
import java.util.HashSet; import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Locale;
import java.util.Set; import java.util.Set;
/** /**
@ -29,7 +30,7 @@ public class PurgeBannedPlayersCommand implements ExecutableCommand {
Set<OfflinePlayer> bannedPlayers = bukkitService.getBannedPlayers(); Set<OfflinePlayer> bannedPlayers = bukkitService.getBannedPlayers();
Set<String> namedBanned = new HashSet<>(bannedPlayers.size()); Set<String> namedBanned = new HashSet<>(bannedPlayers.size());
for (OfflinePlayer offlinePlayer : bannedPlayers) { 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()])); purgeService.purgePlayers(sender, namedBanned, bannedPlayers.toArray(new OfflinePlayer[bannedPlayers.size()]));

View File

@ -9,6 +9,7 @@ import org.bukkit.command.CommandSender;
import javax.inject.Inject; import javax.inject.Inject;
import java.util.List; import java.util.List;
import java.util.Locale;
import static java.util.Collections.singletonList; import static java.util.Collections.singletonList;
@ -36,7 +37,7 @@ public class PurgePlayerCommand implements ExecutableCommand {
private void executeCommand(CommandSender sender, String name, String option) { private void executeCommand(CommandSender sender, String name, String option) {
if ("force".equals(option) || !dataSource.isAuthAvailable(name)) { if ("force".equals(option) || !dataSource.isAuthAvailable(name)) {
OfflinePlayer offlinePlayer = bukkitService.getOfflinePlayer(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); sender.sendMessage("Purged data for player " + name);
} else { } else {
sender.sendMessage("This player is still registered! Are you sure you want to proceed? " sender.sendMessage("This player is still registered! Are you sure you want to proceed? "

View File

@ -17,6 +17,7 @@ import org.bukkit.entity.Player;
import javax.inject.Inject; import javax.inject.Inject;
import java.util.List; import java.util.List;
import java.util.Locale;
/** /**
* Admin command to register a user. * Admin command to register a user.
@ -45,7 +46,7 @@ public class RegisterAdminCommand implements ExecutableCommand {
// Get the player name and password // Get the player name and password
final String playerName = arguments.get(0); final String playerName = arguments.get(0);
final String playerPass = arguments.get(1); final String playerPass = arguments.get(1);
final String playerNameLowerCase = playerName.toLowerCase(); final String playerNameLowerCase = playerName.toLowerCase(Locale.ROOT);
// Command logic // Command logic
ValidationResult passwordValidation = validationService.validatePassword(playerPass, playerName); ValidationResult passwordValidation = validationService.validatePassword(playerPass, playerName);

View File

@ -9,6 +9,7 @@ import org.bukkit.command.CommandSender;
import javax.inject.Inject; import javax.inject.Inject;
import java.util.List; import java.util.List;
import java.util.Locale;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.TreeMap; import java.util.TreeMap;
@ -45,7 +46,7 @@ public class DebugCommand implements ExecutableCommand {
if (arguments.isEmpty()) { if (arguments.isEmpty()) {
return null; return null;
} }
return getSections().get(arguments.get(0).toLowerCase()); return getSections().get(arguments.get(0).toLowerCase(Locale.ROOT));
} }
private void sendAvailableSections(CommandSender sender) { private void sendAvailableSections(CommandSender sender) {

View File

@ -12,6 +12,7 @@ import org.bukkit.entity.Player;
import javax.inject.Inject; import javax.inject.Inject;
import java.util.List; import java.util.List;
import java.util.Locale;
/** /**
* The command for a player to change his password with. * The command for a player to change his password with.
@ -35,7 +36,7 @@ public class ChangePasswordCommand extends PlayerCommand {
@Override @Override
public void runCommand(Player player, List<String> arguments) { public void runCommand(Player player, List<String> arguments) {
String name = player.getName().toLowerCase(); String name = player.getName().toLowerCase(Locale.ROOT);
if (!playerCache.isAuthenticated(name)) { if (!playerCache.isAuthenticated(name)) {
commonService.send(player, MessageKey.NOT_LOGGED_IN); commonService.send(player, MessageKey.NOT_LOGGED_IN);

View File

@ -4,6 +4,7 @@ import fr.xephi.authme.initialization.HasCleanup;
import fr.xephi.authme.util.expiring.ExpiringSet; import fr.xephi.authme.util.expiring.ExpiringSet;
import javax.inject.Inject; import javax.inject.Inject;
import java.util.Locale;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
public class ProxySessionManager implements HasCleanup { public class ProxySessionManager implements HasCleanup {
@ -21,7 +22,7 @@ public class ProxySessionManager implements HasCleanup {
* @param name the player's name * @param name the player's name
*/ */
private void setActiveSession(String name) { private void setActiveSession(String name) {
activeProxySessions.add(name.toLowerCase()); activeProxySessions.add(name.toLowerCase(Locale.ROOT));
} }
/** /**

View File

@ -16,6 +16,7 @@ import org.bukkit.entity.Player;
import javax.inject.Inject; import javax.inject.Inject;
import java.util.HashSet; import java.util.HashSet;
import java.util.Locale;
import java.util.Set; import java.util.Set;
import java.util.concurrent.TimeUnit; 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 * @return true if the player has been verified, false otherwise
*/ */
private boolean isPlayerVerified(String name) { 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 * @return true if the code exists, false otherwise
*/ */
public boolean hasCode(String name) { 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(); final String email = emailResult.getValue();
if (!Utils.isEmailEmpty(email)) { if (!Utils.isEmailEmpty(email)) {
String code = RandomStringUtils.generateNum(6); // 6 digits code 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); emailService.sendVerificationMail(name, email, code);
} }
} }
@ -150,7 +151,7 @@ public class VerificationCodeManager implements SettingsDependent, HasCleanup {
*/ */
public boolean checkCode(String name, String code) { public boolean checkCode(String name, String code) {
boolean correct = false; boolean correct = false;
if (code.equals(verificationCodes.get(name.toLowerCase()))) { if (code.equals(verificationCodes.get(name.toLowerCase(Locale.ROOT)))) {
verify(name); verify(name);
correct = true; correct = true;
} }
@ -163,7 +164,7 @@ public class VerificationCodeManager implements SettingsDependent, HasCleanup {
* @param name the name of the player to generate a code for * @param name the name of the player to generate a code for
*/ */
public void verify(String name) { 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 * @param name the name of the player to generate a code for
*/ */
public void unverify(String name){ public void unverify(String name){
verifiedPlayers.remove(name.toLowerCase()); verifiedPlayers.remove(name.toLowerCase(Locale.ROOT));
} }
@Override @Override

View File

@ -3,6 +3,7 @@ package fr.xephi.authme.data.auth;
import fr.xephi.authme.security.crypts.HashedPassword; import fr.xephi.authme.security.crypts.HashedPassword;
import org.bukkit.Location; import org.bukkit.Location;
import java.util.Locale;
import java.util.Objects; import java.util.Objects;
import java.util.Optional; import java.util.Optional;
import java.util.UUID; import java.util.UUID;
@ -54,7 +55,7 @@ public class PlayerAuth {
public void setNickname(String nickname) { public void setNickname(String nickname) {
this.nickname = nickname.toLowerCase(); this.nickname = nickname.toLowerCase(Locale.ROOT);
} }
public String getNickname() { public String getNickname() {
@ -239,7 +240,7 @@ public class PlayerAuth {
*/ */
public PlayerAuth build() { public PlayerAuth build() {
PlayerAuth auth = new PlayerAuth(); PlayerAuth auth = new PlayerAuth();
auth.nickname = checkNotNull(name).toLowerCase(); auth.nickname = checkNotNull(name).toLowerCase(Locale.ROOT);
auth.realName = Optional.ofNullable(realName).orElse("Player"); auth.realName = Optional.ofNullable(realName).orElse("Player");
auth.password = Optional.ofNullable(password).orElse(new HashedPassword("")); auth.password = Optional.ofNullable(password).orElse(new HashedPassword(""));
auth.totpKey = totpKey; auth.totpKey = totpKey;

View File

@ -1,6 +1,7 @@
package fr.xephi.authme.data.auth; package fr.xephi.authme.data.auth;
import java.util.Locale;
import java.util.Map; import java.util.Map;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
@ -20,7 +21,7 @@ public class PlayerCache {
* @param auth the player auth object to save * @param auth the player auth object to save
*/ */
public void updatePlayer(PlayerAuth auth) { 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 * @param user name of the player to remove
*/ */
public void removePlayer(String user) { 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. * @return true if player is logged in, false otherwise.
*/ */
public boolean isAuthenticated(String user) { 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 * @return the associated auth object, or null if not available
*/ */
public PlayerAuth getAuth(String user) { public PlayerAuth getAuth(String user) {
return cache.get(user.toLowerCase()); return cache.get(user.toLowerCase(Locale.ROOT));
} }
/** /**

View File

@ -3,6 +3,7 @@ package fr.xephi.authme.data.captcha;
import fr.xephi.authme.util.RandomStringUtils; import fr.xephi.authme.util.RandomStringUtils;
import fr.xephi.authme.util.expiring.ExpiringMap; import fr.xephi.authme.util.expiring.ExpiringMap;
import java.util.Locale;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
/** /**
@ -51,7 +52,7 @@ public class CaptchaCodeStorage {
* @return the code the player is required to enter * @return the code the player is required to enter
*/ */
public String getCodeOrGenerateNew(String name) { 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; return code == null ? generateCode(name) : code;
} }
@ -63,7 +64,7 @@ public class CaptchaCodeStorage {
*/ */
private String generateCode(String name) { private String generateCode(String name) {
String code = RandomStringUtils.generate(captchaLength); String code = RandomStringUtils.generate(captchaLength);
captchaCodes.put(name.toLowerCase(), code); captchaCodes.put(name.toLowerCase(Locale.ROOT), code);
return code; return code;
} }
@ -76,7 +77,7 @@ public class CaptchaCodeStorage {
* @return true if the code matches, false otherwise * @return true if the code matches, false otherwise
*/ */
public boolean checkCode(String name, String code) { public boolean checkCode(String name, String code) {
String nameLowerCase = name.toLowerCase(); String nameLowerCase = name.toLowerCase(Locale.ROOT);
String savedCode = captchaCodes.get(nameLowerCase); String savedCode = captchaCodes.get(nameLowerCase);
if (savedCode != null && savedCode.equalsIgnoreCase(code)) { if (savedCode != null && savedCode.equalsIgnoreCase(code)) {
captchaCodes.remove(nameLowerCase); captchaCodes.remove(nameLowerCase);

View File

@ -8,6 +8,7 @@ import fr.xephi.authme.util.expiring.TimedCounter;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import javax.inject.Inject; import javax.inject.Inject;
import java.util.Locale;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
/** /**
@ -36,14 +37,14 @@ public class LoginCaptchaManager implements CaptchaManager, SettingsDependent, H
*/ */
public void increaseLoginFailureCount(String name) { public void increaseLoginFailureCount(String name) {
if (isEnabled) { if (isEnabled) {
String playerLower = name.toLowerCase(); String playerLower = name.toLowerCase(Locale.ROOT);
playerCounts.increment(playerLower); playerCounts.increment(playerLower);
} }
} }
@Override @Override
public boolean isCaptchaRequired(String playerName) { public boolean isCaptchaRequired(String playerName) {
return isEnabled && playerCounts.get(playerName.toLowerCase()) >= threshold; return isEnabled && playerCounts.get(playerName.toLowerCase(Locale.ROOT)) >= threshold;
} }
@Override @Override
@ -53,7 +54,7 @@ public class LoginCaptchaManager implements CaptchaManager, SettingsDependent, H
@Override @Override
public boolean checkCode(Player player, String code) { 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); boolean isCodeCorrect = captchaCodeStorage.checkCode(nameLower, code);
if (isCodeCorrect) { if (isCodeCorrect) {
playerCounts.remove(nameLower); playerCounts.remove(nameLower);
@ -68,7 +69,7 @@ public class LoginCaptchaManager implements CaptchaManager, SettingsDependent, H
*/ */
public void resetLoginFailureCount(String name) { public void resetLoginFailureCount(String name) {
if (isEnabled) { if (isEnabled) {
playerCounts.remove(name.toLowerCase()); playerCounts.remove(name.toLowerCase(Locale.ROOT));
} }
} }

View File

@ -8,6 +8,7 @@ import fr.xephi.authme.util.expiring.ExpiringSet;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import javax.inject.Inject; import javax.inject.Inject;
import java.util.Locale;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
/** /**
@ -31,7 +32,7 @@ public class RegistrationCaptchaManager implements CaptchaManager, SettingsDepen
@Override @Override
public boolean isCaptchaRequired(String name) { public boolean isCaptchaRequired(String name) {
return isEnabled && !verifiedNamesForRegistration.contains(name.toLowerCase()); return isEnabled && !verifiedNamesForRegistration.contains(name.toLowerCase(Locale.ROOT));
} }
@Override @Override
@ -41,7 +42,7 @@ public class RegistrationCaptchaManager implements CaptchaManager, SettingsDepen
@Override @Override
public boolean checkCode(Player player, String code) { 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); boolean isCodeCorrect = captchaCodeStorage.checkCode(nameLower, code);
if (isCodeCorrect) { if (isCodeCorrect) {
verifiedNamesForRegistration.add(nameLower); verifiedNamesForRegistration.add(nameLower);

View File

@ -9,6 +9,7 @@ import org.bukkit.Location;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import javax.inject.Inject; import javax.inject.Inject;
import java.util.Locale;
import java.util.Map; import java.util.Map;
import java.util.Optional; import java.util.Optional;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
@ -55,7 +56,7 @@ public class LimboService {
* @param isRegistered whether or not the player is registered * @param isRegistered whether or not the player is registered
*/ */
public void createLimboPlayer(Player player, boolean isRegistered) { 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); LimboPlayer limboFromDisk = persistence.getLimboPlayer(player);
if (limboFromDisk != null) { if (limboFromDisk != null) {
@ -89,7 +90,7 @@ public class LimboService {
* @return the associated limbo player, or null if none available * @return the associated limbo player, or null if none available
*/ */
public LimboPlayer getLimboPlayer(String name) { 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 * @return true if present, false otherwise
*/ */
public boolean hasLimboPlayer(String name) { 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 * @param player the player whose data should be restored
*/ */
public void restoreData(Player player) { public void restoreData(Player player) {
String lowerName = player.getName().toLowerCase(); String lowerName = player.getName().toLowerCase(Locale.ROOT);
LimboPlayer limbo = entries.remove(lowerName); LimboPlayer limbo = entries.remove(lowerName);
if (limbo == null) { if (limbo == null) {
@ -178,7 +179,7 @@ public class LimboService {
* @return Optional with the limbo player * @return Optional with the limbo player
*/ */
private Optional<LimboPlayer> getLimboOrLogError(Player player, String context) { private Optional<LimboPlayer> getLimboOrLogError(Player player, String context) {
LimboPlayer limbo = entries.get(player.getName().toLowerCase()); LimboPlayer limbo = entries.get(player.getName().toLowerCase(Locale.ROOT));
if (limbo == null) { if (limbo == null) {
logger.debug("No LimboPlayer found for `{0}`. Action: {1}", player.getName(), context); logger.debug("No LimboPlayer found for `{0}`. Action: {1}", player.getName(), context);
} }

View File

@ -18,6 +18,7 @@ import fr.xephi.authme.util.Utils;
import java.util.Collection; import java.util.Collection;
import java.util.List; import java.util.List;
import java.util.Locale;
import java.util.Optional; import java.util.Optional;
import java.util.Set; import java.util.Set;
import java.util.concurrent.Executors; import java.util.concurrent.Executors;
@ -86,7 +87,7 @@ public class CacheDataSource implements DataSource {
@Override @Override
public HashedPassword getPassword(String user) { public HashedPassword getPassword(String user) {
user = user.toLowerCase(); user = user.toLowerCase(Locale.ROOT);
Optional<PlayerAuth> pAuthOpt = cachedAuths.getIfPresent(user); Optional<PlayerAuth> pAuthOpt = cachedAuths.getIfPresent(user);
if (pAuthOpt != null && pAuthOpt.isPresent()) { if (pAuthOpt != null && pAuthOpt.isPresent()) {
return pAuthOpt.get().getPassword(); return pAuthOpt.get().getPassword();
@ -96,7 +97,7 @@ public class CacheDataSource implements DataSource {
@Override @Override
public PlayerAuth getAuth(String user) { public PlayerAuth getAuth(String user) {
user = user.toLowerCase(); user = user.toLowerCase(Locale.ROOT);
return cachedAuths.getUnchecked(user).orElse(null); return cachedAuths.getUnchecked(user).orElse(null);
} }
@ -120,7 +121,7 @@ public class CacheDataSource implements DataSource {
@Override @Override
public boolean updatePassword(String user, HashedPassword password) { public boolean updatePassword(String user, HashedPassword password) {
user = user.toLowerCase(); user = user.toLowerCase(Locale.ROOT);
boolean result = source.updatePassword(user, password); boolean result = source.updatePassword(user, password);
if (result) { if (result) {
cachedAuths.refresh(user); cachedAuths.refresh(user);
@ -153,7 +154,7 @@ public class CacheDataSource implements DataSource {
@Override @Override
public boolean removeAuth(String name) { public boolean removeAuth(String name) {
name = name.toLowerCase(); name = name.toLowerCase(Locale.ROOT);
boolean result = source.removeAuth(name); boolean result = source.removeAuth(name);
if (result) { if (result) {
cachedAuths.invalidate(name); cachedAuths.invalidate(name);
@ -210,12 +211,12 @@ public class CacheDataSource implements DataSource {
@Override @Override
public void setLogged(final String user) { public void setLogged(final String user) {
source.setLogged(user.toLowerCase()); source.setLogged(user.toLowerCase(Locale.ROOT));
} }
@Override @Override
public void setUnlogged(final String user) { public void setUnlogged(final String user) {
source.setUnlogged(user.toLowerCase()); source.setUnlogged(user.toLowerCase(Locale.ROOT));
} }
@Override @Override

View File

@ -24,6 +24,7 @@ import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.HashSet; import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Locale;
import java.util.Set; import java.util.Set;
import java.util.UUID; import java.util.UUID;
@ -309,7 +310,7 @@ public class MySQL extends AbstractSqlDataSource {
String sql = "SELECT * FROM " + tableName + " WHERE " + col.NAME + "=?;"; String sql = "SELECT * FROM " + tableName + " WHERE " + col.NAME + "=?;";
PlayerAuth auth; PlayerAuth auth;
try (Connection con = getConnection(); PreparedStatement pst = con.prepareStatement(sql)) { 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()) { try (ResultSet rs = pst.executeQuery()) {
if (rs.next()) { if (rs.next()) {
int id = rs.getInt(col.ID); int id = rs.getInt(col.ID);
@ -377,11 +378,11 @@ public class MySQL extends AbstractSqlDataSource {
@Override @Override
public boolean removeAuth(String user) { public boolean removeAuth(String user) {
user = user.toLowerCase(); user = user.toLowerCase(Locale.ROOT);
String sql = "DELETE FROM " + tableName + " WHERE " + col.NAME + "=?;"; String sql = "DELETE FROM " + tableName + " WHERE " + col.NAME + "=?;";
try (Connection con = getConnection(); PreparedStatement pst = con.prepareStatement(sql)) { try (Connection con = getConnection(); PreparedStatement pst = con.prepareStatement(sql)) {
sqlExtension.removeAuth(user, con); sqlExtension.removeAuth(user, con);
pst.setString(1, user.toLowerCase()); pst.setString(1, user.toLowerCase(Locale.ROOT));
pst.executeUpdate(); pst.executeUpdate();
return true; return true;
} catch (SQLException ex) { } catch (SQLException ex) {
@ -402,7 +403,7 @@ public class MySQL extends AbstractSqlDataSource {
String sql = "DELETE FROM " + tableName + " WHERE " + col.NAME + "=?;"; String sql = "DELETE FROM " + tableName + " WHERE " + col.NAME + "=?;";
try (Connection con = getConnection(); PreparedStatement pst = con.prepareStatement(sql)) { try (Connection con = getConnection(); PreparedStatement pst = con.prepareStatement(sql)) {
for (String name : toPurge) { for (String name : toPurge) {
pst.setString(1, name.toLowerCase()); pst.setString(1, name.toLowerCase(Locale.ROOT));
pst.executeUpdate(); pst.executeUpdate();
} }
} catch (SQLException ex) { } catch (SQLException ex) {
@ -470,7 +471,7 @@ public class MySQL extends AbstractSqlDataSource {
String sql = "UPDATE " + tableName + " SET " + col.TOTP_KEY + " = ? WHERE " + col.NAME + " = ?"; String sql = "UPDATE " + tableName + " SET " + col.TOTP_KEY + " = ? WHERE " + col.NAME + " = ?";
try (Connection con = getConnection(); PreparedStatement pst = con.prepareStatement(sql)) { try (Connection con = getConnection(); PreparedStatement pst = con.prepareStatement(sql)) {
pst.setString(1, totpKey); pst.setString(1, totpKey);
pst.setString(2, user.toLowerCase()); pst.setString(2, user.toLowerCase(Locale.ROOT));
pst.executeUpdate(); pst.executeUpdate();
return true; return true;
} catch (SQLException e) { } catch (SQLException e) {

View File

@ -23,6 +23,7 @@ import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.HashSet; import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Locale;
import java.util.Set; import java.util.Set;
import static fr.xephi.authme.datasource.SqlDataSourceUtils.getNullableLong; 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 { 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(); return !rs.next();
} }
} }
@ -267,7 +268,7 @@ public class PostgreSqlDataSource extends AbstractSqlDataSource {
String sql = "SELECT * FROM " + tableName + " WHERE " + col.NAME + "=?;"; String sql = "SELECT * FROM " + tableName + " WHERE " + col.NAME + "=?;";
PlayerAuth auth; PlayerAuth auth;
try (Connection con = getConnection(); PreparedStatement pst = con.prepareStatement(sql)) { 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()) { try (ResultSet rs = pst.executeQuery()) {
if (rs.next()) { if (rs.next()) {
int id = rs.getInt(col.ID); int id = rs.getInt(col.ID);
@ -335,11 +336,11 @@ public class PostgreSqlDataSource extends AbstractSqlDataSource {
@Override @Override
public boolean removeAuth(String user) { public boolean removeAuth(String user) {
user = user.toLowerCase(); user = user.toLowerCase(Locale.ROOT);
String sql = "DELETE FROM " + tableName + " WHERE " + col.NAME + "=?;"; String sql = "DELETE FROM " + tableName + " WHERE " + col.NAME + "=?;";
try (Connection con = getConnection(); PreparedStatement pst = con.prepareStatement(sql)) { try (Connection con = getConnection(); PreparedStatement pst = con.prepareStatement(sql)) {
sqlExtension.removeAuth(user, con); sqlExtension.removeAuth(user, con);
pst.setString(1, user.toLowerCase()); pst.setString(1, user.toLowerCase(Locale.ROOT));
pst.executeUpdate(); pst.executeUpdate();
return true; return true;
} catch (SQLException ex) { } catch (SQLException ex) {
@ -360,7 +361,7 @@ public class PostgreSqlDataSource extends AbstractSqlDataSource {
String sql = "DELETE FROM " + tableName + " WHERE " + col.NAME + "=?;"; String sql = "DELETE FROM " + tableName + " WHERE " + col.NAME + "=?;";
try (Connection con = getConnection(); PreparedStatement pst = con.prepareStatement(sql)) { try (Connection con = getConnection(); PreparedStatement pst = con.prepareStatement(sql)) {
for (String name : toPurge) { for (String name : toPurge) {
pst.setString(1, name.toLowerCase()); pst.setString(1, name.toLowerCase(Locale.ROOT));
pst.executeUpdate(); pst.executeUpdate();
} }
} catch (SQLException ex) { } catch (SQLException ex) {
@ -428,7 +429,7 @@ public class PostgreSqlDataSource extends AbstractSqlDataSource {
String sql = "UPDATE " + tableName + " SET " + col.TOTP_KEY + " = ? WHERE " + col.NAME + " = ?"; String sql = "UPDATE " + tableName + " SET " + col.TOTP_KEY + " = ? WHERE " + col.NAME + " = ?";
try (Connection con = getConnection(); PreparedStatement pst = con.prepareStatement(sql)) { try (Connection con = getConnection(); PreparedStatement pst = con.prepareStatement(sql)) {
pst.setString(1, totpKey); pst.setString(1, totpKey);
pst.setString(2, user.toLowerCase()); pst.setString(2, user.toLowerCase(Locale.ROOT));
pst.executeUpdate(); pst.executeUpdate();
return true; return true;
} catch (SQLException e) { } catch (SQLException e) {

View File

@ -20,6 +20,7 @@ import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.HashSet; import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Locale;
import java.util.Set; import java.util.Set;
import static fr.xephi.authme.datasource.SqlDataSourceUtils.getNullableLong; 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 + "=?;"; String delete = "DELETE FROM " + tableName + " WHERE " + col.NAME + "=?;";
try (PreparedStatement deletePst = con.prepareStatement(delete)) { try (PreparedStatement deletePst = con.prepareStatement(delete)) {
for (String name : toPurge) { for (String name : toPurge) {
deletePst.setString(1, name.toLowerCase()); deletePst.setString(1, name.toLowerCase(Locale.ROOT));
deletePst.executeUpdate(); deletePst.executeUpdate();
} }
} catch (SQLException ex) { } catch (SQLException ex) {
@ -280,7 +281,7 @@ public class SQLite extends AbstractSqlDataSource {
public boolean removeAuth(String user) { public boolean removeAuth(String user) {
String sql = "DELETE FROM " + tableName + " WHERE " + col.NAME + "=?;"; String sql = "DELETE FROM " + tableName + " WHERE " + col.NAME + "=?;";
try (PreparedStatement pst = con.prepareStatement(sql)) { try (PreparedStatement pst = con.prepareStatement(sql)) {
pst.setString(1, user.toLowerCase()); pst.setString(1, user.toLowerCase(Locale.ROOT));
pst.executeUpdate(); pst.executeUpdate();
return true; return true;
} catch (SQLException ex) { } catch (SQLException ex) {
@ -355,7 +356,7 @@ public class SQLite extends AbstractSqlDataSource {
String sql = "UPDATE " + tableName + " SET " + col.TOTP_KEY + " = ? WHERE " + col.NAME + " = ?"; String sql = "UPDATE " + tableName + " SET " + col.TOTP_KEY + " = ? WHERE " + col.NAME + " = ?";
try (PreparedStatement pst = con.prepareStatement(sql)) { try (PreparedStatement pst = con.prepareStatement(sql)) {
pst.setString(1, totpKey); pst.setString(1, totpKey);
pst.setString(2, user.toLowerCase()); pst.setString(2, user.toLowerCase(Locale.ROOT));
pst.executeUpdate(); pst.executeUpdate();
return true; return true;
} catch (SQLException e) { } catch (SQLException e) {

View File

@ -14,6 +14,7 @@ import fr.xephi.authme.settings.properties.DatabaseSettings;
import java.sql.Connection; import java.sql.Connection;
import java.sql.SQLException; import java.sql.SQLException;
import java.util.List; import java.util.List;
import java.util.Locale;
import static ch.jalu.datasourcecolumns.sqlimplementation.SqlColumnsHandlerConfig.forConnectionPool; import static ch.jalu.datasourcecolumns.sqlimplementation.SqlColumnsHandlerConfig.forConnectionPool;
import static ch.jalu.datasourcecolumns.sqlimplementation.SqlColumnsHandlerConfig.forSingleConnection; import static ch.jalu.datasourcecolumns.sqlimplementation.SqlColumnsHandlerConfig.forSingleConnection;
@ -78,7 +79,7 @@ public final class AuthMeColumnsHandler {
*/ */
public <T> boolean update(String name, DataSourceColumn<T> column, T value) { public <T> boolean update(String name, DataSourceColumn<T> column, T value) {
try { try {
return internalHandler.update(name.toLowerCase(), column, value); return internalHandler.update(name.toLowerCase(Locale.ROOT), column, value);
} catch (SQLException e) { } catch (SQLException e) {
logSqlException(e); logSqlException(e);
return false; return false;
@ -110,7 +111,7 @@ public final class AuthMeColumnsHandler {
*/ */
public boolean update(String name, UpdateValues<ColumnContext> updateValues) { public boolean update(String name, UpdateValues<ColumnContext> updateValues) {
try { try {
return internalHandler.update(name.toLowerCase(), updateValues); return internalHandler.update(name.toLowerCase(Locale.ROOT), updateValues);
} catch (SQLException e) { } catch (SQLException e) {
logSqlException(e); logSqlException(e);
return false; return false;
@ -145,7 +146,7 @@ public final class AuthMeColumnsHandler {
* @throws SQLException . * @throws SQLException .
*/ */
public <T> DataSourceValue<T> retrieve(String name, DataSourceColumn<T> column) throws SQLException { public <T> DataSourceValue<T> retrieve(String name, DataSourceColumn<T> 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 . * @throws SQLException .
*/ */
public DataSourceValues retrieve(String name, DataSourceColumn<?>... columns) 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);
} }
/** /**

View File

@ -14,6 +14,7 @@ import java.io.BufferedReader;
import java.io.File; import java.io.File;
import java.io.FileReader; import java.io.FileReader;
import java.io.IOException; import java.io.IOException;
import java.util.Locale;
/** /**
* Converter for CrazyLogin to AuthMe. * Converter for CrazyLogin to AuthMe.
@ -70,7 +71,7 @@ public class CrazyLoginConverter implements Converter {
String password = args[1]; String password = args[1];
if (password != null) { if (password != null) {
PlayerAuth auth = PlayerAuth.builder() PlayerAuth auth = PlayerAuth.builder()
.name(playerName.toLowerCase()) .name(playerName.toLowerCase(Locale.ROOT))
.realName(playerName) .realName(playerName)
.password(password, null) .password(password, null)
.build(); .build();

View File

@ -12,6 +12,7 @@ import org.bukkit.configuration.file.YamlConfiguration;
import javax.inject.Inject; import javax.inject.Inject;
import java.io.File; import java.io.File;
import java.util.Locale;
import static fr.xephi.authme.util.FileUtils.makePath; import static fr.xephi.authme.util.FileUtils.makePath;
@ -35,7 +36,7 @@ public class RoyalAuthConverter implements Converter {
public void execute(CommandSender sender) { public void execute(CommandSender sender) {
for (OfflinePlayer player : plugin.getServer().getOfflinePlayers()) { for (OfflinePlayer player : plugin.getServer().getOfflinePlayers()) {
try { try {
String name = player.getName().toLowerCase(); String name = player.getName().toLowerCase(Locale.ROOT);
File file = new File(makePath(".", "plugins", "RoyalAuth", "userdata", name + ".yml")); File file = new File(makePath(".", "plugins", "RoyalAuth", "userdata", name + ".yml"));
if (dataSource.isAuthAvailable(name) || !file.exists()) { if (dataSource.isAuthAvailable(name) || !file.exists()) {

View File

@ -12,6 +12,7 @@ import org.bukkit.command.CommandSender;
import javax.inject.Inject; import javax.inject.Inject;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.util.Locale;
import java.util.Scanner; import java.util.Scanner;
import java.util.UUID; import java.util.UUID;
@ -48,12 +49,12 @@ public class VAuthConverter implements Converter {
continue; continue;
} }
auth = PlayerAuth.builder() auth = PlayerAuth.builder()
.name(pname.toLowerCase()) .name(pname.toLowerCase(Locale.ROOT))
.realName(pname) .realName(pname)
.password(password, null).build(); .password(password, null).build();
} else { } else {
auth = PlayerAuth.builder() auth = PlayerAuth.builder()
.name(name.toLowerCase()) .name(name.toLowerCase(Locale.ROOT))
.realName(name) .realName(name)
.password(password, null).build(); .password(password, null).build();
} }

View File

@ -18,6 +18,7 @@ import java.sql.ResultSet;
import java.sql.SQLException; import java.sql.SQLException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Locale;
import static fr.xephi.authme.util.FileUtils.makePath; import static fr.xephi.authme.util.FileUtils.makePath;
@ -66,7 +67,7 @@ public class XAuthConverter implements Converter {
String psw = getPassword(id); String psw = getPassword(id);
if (psw != null && !psw.isEmpty() && pl != null) { if (psw != null && !psw.isEmpty() && pl != null) {
PlayerAuth auth = PlayerAuth.builder() PlayerAuth auth = PlayerAuth.builder()
.name(pl.toLowerCase()) .name(pl.toLowerCase(Locale.ROOT))
.realName(pl) .realName(pl)
.password(psw, null).build(); .password(psw, null).build();
database.saveAuth(auth); database.saveAuth(auth);
@ -89,7 +90,7 @@ public class XAuthConverter implements Converter {
if (!rs.next()) { if (!rs.next()) {
return null; return null;
} }
realPass = rs.getString("playername").toLowerCase(); realPass = rs.getString("playername").toLowerCase(Locale.ROOT);
} catch (SQLException e) { } catch (SQLException e) {
xAuthLog.severe("Failed to retrieve name for account: " + id, e); xAuthLog.severe("Failed to retrieve name for account: " + id, e);
return null; return null;

View File

@ -14,6 +14,7 @@ import org.bukkit.Location;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import javax.inject.Inject; import javax.inject.Inject;
import java.util.Locale;
/** /**
* Saves all players' data when the plugin shuts down. * Saves all players' data when the plugin shuts down.
@ -48,7 +49,7 @@ public class OnShutdownPlayerSaver {
} }
private void savePlayer(Player player) { private void savePlayer(Player player) {
String name = player.getName().toLowerCase(); String name = player.getName().toLowerCase(Locale.ROOT);
if (PlayerUtils.isNpc(player) || validationService.isUnrestricted(name)) { if (PlayerUtils.isNpc(player) || validationService.isUnrestricted(name)) {
return; return;
} }
@ -64,7 +65,7 @@ public class OnShutdownPlayerSaver {
if (settings.getProperty(RestrictionSettings.SAVE_QUIT_LOCATION)) { if (settings.getProperty(RestrictionSettings.SAVE_QUIT_LOCATION)) {
Location loc = spawnLoader.getPlayerLocationOrSpawn(player); Location loc = spawnLoader.getPlayerLocationOrSpawn(player);
PlayerAuth auth = PlayerAuth.builder() PlayerAuth auth = PlayerAuth.builder()
.name(player.getName().toLowerCase()) .name(player.getName().toLowerCase(Locale.ROOT))
.realName(player.getName()) .realName(player.getName())
.location(loc).build(); .location(loc).build();
dataSource.updateQuitLoc(auth); dataSource.updateQuitLoc(auth);

View File

@ -25,6 +25,7 @@ import org.bukkit.event.player.PlayerLoginEvent;
import javax.annotation.PostConstruct; import javax.annotation.PostConstruct;
import javax.inject.Inject; import javax.inject.Inject;
import java.util.Collection; import java.util.Collection;
import java.util.Locale;
import java.util.regex.Pattern; import java.util.regex.Pattern;
/** /**
@ -160,7 +161,7 @@ public class OnJoinVerifier implements Reloadable {
String realName = auth.getRealName(); // might be null or "Player" String realName = auth.getRealName(); // might be null or "Player"
if (StringUtils.isEmpty(realName) || "Player".equals(realName)) { if (StringUtils.isEmpty(realName) || "Player".equals(realName)) {
dataSource.updateRealName(connectingName.toLowerCase(), connectingName); dataSource.updateRealName(connectingName.toLowerCase(Locale.ROOT), connectingName);
} else if (!realName.equals(connectingName)) { } else if (!realName.equals(connectingName)) {
throw new FailedVerificationException(MessageKey.INVALID_NAME_CASE, realName, connectingName); throw new FailedVerificationException(MessageKey.INVALID_NAME_CASE, realName, connectingName);
} }

View File

@ -52,6 +52,7 @@ import org.bukkit.event.player.PlayerShearEntityEvent;
import org.bukkit.inventory.InventoryView; import org.bukkit.inventory.InventoryView;
import javax.inject.Inject; import javax.inject.Inject;
import java.util.Locale;
import java.util.Set; import java.util.Set;
import static fr.xephi.authme.settings.properties.RestrictionSettings.ALLOWED_MOVEMENT_RADIUS; import static fr.xephi.authme.settings.properties.RestrictionSettings.ALLOWED_MOVEMENT_RADIUS;
@ -214,7 +215,7 @@ public class PlayerListener implements Listener {
return; return;
} }
String name = player.getName().toLowerCase(); String name = player.getName().toLowerCase(Locale.ROOT);
String joinMsg = event.getJoinMessage(); String joinMsg = event.getJoinMessage();
// Remove the join message while the player isn't logging in // 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) @EventHandler(ignoreCancelled = true, priority = EventPriority.LOWEST)
public void onPlayerCommandPreprocess(PlayerCommandPreprocessEvent event) { 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)) { if (settings.getProperty(HooksSettings.USE_ESSENTIALS_MOTD) && "/motd".equals(cmd)) {
return; return;
} }
@ -482,7 +483,7 @@ public class PlayerListener implements Listener {
return false; return false;
} }
Set<String> whitelist = settings.getProperty(RestrictionSettings.UNRESTRICTED_INVENTORIES); Set<String> 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) @EventHandler(ignoreCancelled = true, priority = EventPriority.LOWEST)

View File

@ -6,6 +6,7 @@ import fr.xephi.authme.util.StringUtils;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.Locale;
/** /**
* Service class for the log filters. * Service class for the log filters.
@ -35,7 +36,7 @@ final class LogFilterHelper {
if (message == null) { if (message == null) {
return false; return false;
} }
String lowerMessage = message.toLowerCase(); String lowerMessage = message.toLowerCase(Locale.ROOT);
return lowerMessage.contains(ISSUED_COMMAND_TEXT) && StringUtils.containsAny(lowerMessage, COMMANDS_TO_SKIP); return lowerMessage.contains(ISSUED_COMMAND_TEXT) && StringUtils.containsAny(lowerMessage, COMMANDS_TO_SKIP);
} }

View File

@ -14,6 +14,7 @@ import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import javax.inject.Inject; import javax.inject.Inject;
import java.util.Locale;
public class AsyncChangePassword implements AsynchronousProcess { public class AsyncChangePassword implements AsynchronousProcess {
@ -42,7 +43,7 @@ public class AsyncChangePassword implements AsynchronousProcess {
* @param newPassword the new password chosen by the player * @param newPassword the new password chosen by the player
*/ */
public void changePassword(Player player, String oldPassword, String newPassword) { 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); PlayerAuth auth = playerCache.getAuth(name);
if (passwordSecurity.comparePassword(oldPassword, auth.getPassword(), player.getName())) { if (passwordSecurity.comparePassword(oldPassword, auth.getPassword(), player.getName())) {
HashedPassword hashedPassword = passwordSecurity.computeHash(newPassword, name); HashedPassword hashedPassword = passwordSecurity.computeHash(newPassword, name);
@ -71,7 +72,7 @@ public class AsyncChangePassword implements AsynchronousProcess {
* @param newPassword the new password chosen for the player * @param newPassword the new password chosen for the player
*/ */
public void changePasswordAsAdmin(CommandSender sender, String playerName, String newPassword) { 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 (!(playerCache.isAuthenticated(lowerCaseName) || dataSource.isAuthAvailable(lowerCaseName))) {
if (sender == null) { if (sender == null) {
logger.warning("Tried to change password for user " + lowerCaseName + " but it doesn't exist!"); logger.warning("Tried to change password for user " + lowerCaseName + " but it doesn't exist!");

View File

@ -15,6 +15,7 @@ import fr.xephi.authme.util.Utils;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import javax.inject.Inject; import javax.inject.Inject;
import java.util.Locale;
/** /**
* Async task to add an email to an account. * Async task to add an email to an account.
@ -48,7 +49,7 @@ public class AsyncAddEmail implements AsynchronousProcess {
* @param email the email to add * @param email the email to add
*/ */
public void addEmail(Player player, String email) { public void addEmail(Player player, String email) {
String playerName = player.getName().toLowerCase(); String playerName = player.getName().toLowerCase(Locale.ROOT);
if (playerCache.isAuthenticated(playerName)) { if (playerCache.isAuthenticated(playerName)) {
PlayerAuth auth = playerCache.getAuth(playerName); PlayerAuth auth = playerCache.getAuth(playerName);

View File

@ -14,6 +14,7 @@ import fr.xephi.authme.service.ValidationService;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import javax.inject.Inject; import javax.inject.Inject;
import java.util.Locale;
/** /**
* Async task for changing the email. * Async task for changing the email.
@ -48,7 +49,7 @@ public class AsyncChangeEmail implements AsynchronousProcess {
* @param newEmail provided new email * @param newEmail provided new email
*/ */
public void changeEmail(Player player, String oldEmail, String newEmail) { 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)) { if (playerCache.isAuthenticated(playerName)) {
PlayerAuth auth = playerCache.getAuth(playerName); PlayerAuth auth = playerCache.getAuth(playerName);
String currentEmail = auth.getEmail(); String currentEmail = auth.getEmail();

View File

@ -32,6 +32,8 @@ import org.bukkit.potion.PotionEffectType;
import javax.inject.Inject; import javax.inject.Inject;
import java.util.Locale;
import static fr.xephi.authme.service.BukkitService.TICKS_PER_SECOND; import static fr.xephi.authme.service.BukkitService.TICKS_PER_SECOND;
import static fr.xephi.authme.settings.properties.RestrictionSettings.PROTECT_INVENTORY_BEFORE_LOGIN; 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 * @param player the player to process
*/ */
public void processJoin(Player player) { public void processJoin(Player player) {
String name = player.getName().toLowerCase(); String name = player.getName().toLowerCase(Locale.ROOT);
String ip = PlayerUtils.getPlayerIp(player); String ip = PlayerUtils.getPlayerIp(player);
if (!validationService.fulfillsNameRestrictions(player)) { if (!validationService.fulfillsNameRestrictions(player)) {

View File

@ -40,6 +40,7 @@ import org.bukkit.entity.Player;
import javax.inject.Inject; import javax.inject.Inject;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Locale;
/** /**
* Asynchronous task for a player login. * Asynchronous task for a player login.
@ -153,7 +154,7 @@ public class AsynchronousLogin implements AsynchronousProcess {
* (e.g. because he is already logged in) * (e.g. because he is already logged in)
*/ */
private PlayerAuth getPlayerAuth(Player player, boolean quiet) { private PlayerAuth getPlayerAuth(Player player, boolean quiet) {
String name = player.getName().toLowerCase(); String name = player.getName().toLowerCase(Locale.ROOT);
if (playerCache.isAuthenticated(name)) { if (playerCache.isAuthenticated(name)) {
if (!quiet) { if (!quiet) {
service.send(player, MessageKey.ALREADY_LOGGED_IN_ERROR); service.send(player, MessageKey.ALREADY_LOGGED_IN_ERROR);
@ -206,7 +207,7 @@ public class AsynchronousLogin implements AsynchronousProcess {
* false otherwise * false otherwise
*/ */
private boolean checkPlayerInfo(Player player, PlayerAuth auth, String password) { 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 captcha is required send a message to the player and deny to log in
if (loginCaptchaManager.isCaptchaRequired(name)) { if (loginCaptchaManager.isCaptchaRequired(name)) {
@ -380,7 +381,7 @@ public class AsynchronousLogin implements AsynchronousProcess {
for (Player onlinePlayer : bukkitService.getOnlinePlayers()) { for (Player onlinePlayer : bukkitService.getOnlinePlayers()) {
if (ip.equalsIgnoreCase(PlayerUtils.getPlayerIp(onlinePlayer)) if (ip.equalsIgnoreCase(PlayerUtils.getPlayerIp(onlinePlayer))
&& !onlinePlayer.getName().equals(name) && !onlinePlayer.getName().equals(name)
&& dataSource.isLogged(onlinePlayer.getName().toLowerCase())) { && dataSource.isLogged(onlinePlayer.getName().toLowerCase(Locale.ROOT))) {
++count; ++count;
} }
} }

View File

@ -22,6 +22,7 @@ import org.bukkit.potion.PotionEffectType;
import javax.inject.Inject; import javax.inject.Inject;
import java.util.List; import java.util.List;
import java.util.Locale;
import static fr.xephi.authme.settings.properties.RestrictionSettings.PROTECT_INVENTORY_BEFORE_LOGIN; 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 * @param authsWithSameIp registered names with the same IP address as the player's
*/ */
public void processPlayerLogin(Player player, boolean isFirstLogin, List<String> authsWithSameIp) { public void processPlayerLogin(Player player, boolean isFirstLogin, List<String> authsWithSameIp) {
final String name = player.getName().toLowerCase(); final String name = player.getName().toLowerCase(Locale.ROOT);
final LimboPlayer limbo = limboService.getLimboPlayer(name); final LimboPlayer limbo = limboService.getLimboPlayer(name);
// Limbo contains the State of the Player before /login // Limbo contains the State of the Player before /login

View File

@ -15,6 +15,7 @@ import fr.xephi.authme.settings.properties.RestrictionSettings;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import javax.inject.Inject; import javax.inject.Inject;
import java.util.Locale;
/** /**
* Async task when a player wants to log out. * 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 * @param player the player wanting to log out
*/ */
public void logout(Player player) { public void logout(Player player) {
String name = player.getName().toLowerCase(); String name = player.getName().toLowerCase(Locale.ROOT);
if (!playerCache.isAuthenticated(name)) { if (!playerCache.isAuthenticated(name)) {
service.send(player, MessageKey.NOT_LOGGED_IN); service.send(player, MessageKey.NOT_LOGGED_IN);
return; return;

View File

@ -18,6 +18,7 @@ import org.bukkit.Location;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import javax.inject.Inject; import javax.inject.Inject;
import java.util.Locale;
/** /**
* Async process called when a player quits the server. * 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())) { if (player == null || validationService.isUnrestricted(player.getName())) {
return; return;
} }
String name = player.getName().toLowerCase(); String name = player.getName().toLowerCase(Locale.ROOT);
boolean wasLoggedIn = playerCache.isAuthenticated(name); boolean wasLoggedIn = playerCache.isAuthenticated(name);
if (wasLoggedIn) { if (wasLoggedIn) {

View File

@ -20,6 +20,7 @@ import org.bukkit.entity.Player;
import javax.inject.Inject; import javax.inject.Inject;
import java.util.List; import java.util.List;
import java.util.Locale;
import static fr.xephi.authme.permission.PlayerStatePermission.ALLOW_MULTIPLE_ACCOUNTS; 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. * @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) { private boolean preRegisterCheck(RegistrationMethod<?> variant, Player player) {
String name = player.getName().toLowerCase(); String name = player.getName().toLowerCase(Locale.ROOT);
if (playerCache.isAuthenticated(name)) { if (playerCache.isAuthenticated(name)) {
service.send(player, MessageKey.ALREADY_LOGGED_IN_ERROR); service.send(player, MessageKey.ALREADY_LOGGED_IN_ERROR);
return false; return false;

View File

@ -5,6 +5,8 @@ import fr.xephi.authme.security.crypts.HashedPassword;
import fr.xephi.authme.util.PlayerUtils; import fr.xephi.authme.util.PlayerUtils;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import java.util.Locale;
/** /**
* Helper for constructing PlayerAuth objects. * Helper for constructing PlayerAuth objects.
*/ */
@ -23,7 +25,7 @@ final class PlayerAuthBuilderHelper {
*/ */
static PlayerAuth createPlayerAuth(Player player, HashedPassword hashedPassword, String email) { static PlayerAuth createPlayerAuth(Player player, HashedPassword hashedPassword, String email) {
return PlayerAuth.builder() return PlayerAuth.builder()
.name(player.getName().toLowerCase()) .name(player.getName().toLowerCase(Locale.ROOT))
.realName(player.getName()) .realName(player.getName())
.password(hashedPassword) .password(hashedPassword)
.email(email) .email(email)

View File

@ -13,6 +13,7 @@ import org.bukkit.plugin.PluginManager;
import javax.annotation.PostConstruct; import javax.annotation.PostConstruct;
import javax.inject.Inject; import javax.inject.Inject;
import java.util.Collection; import java.util.Collection;
import java.util.Locale;
/** /**
* Manager class for password-related operations. * Manager class for password-related operations.
@ -54,7 +55,7 @@ public class PasswordSecurity implements Reloadable {
* @return The password hash * @return The password hash
*/ */
public HashedPassword computeHash(String password, String playerName) { public HashedPassword computeHash(String password, String playerName) {
String playerLowerCase = playerName.toLowerCase(); String playerLowerCase = playerName.toLowerCase(Locale.ROOT);
return encryptionMethod.computeHash(password, playerLowerCase); return encryptionMethod.computeHash(password, playerLowerCase);
} }
@ -81,7 +82,7 @@ public class PasswordSecurity implements Reloadable {
* @return True if the password matches, false otherwise * @return True if the password matches, false otherwise
*/ */
public boolean comparePassword(String password, HashedPassword hashedPassword, String playerName) { 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) return methodMatches(encryptionMethod, password, hashedPassword, playerLowerCase)
|| compareWithLegacyHashes(password, hashedPassword, playerLowerCase); || compareWithLegacyHashes(password, hashedPassword, playerLowerCase);
} }

View File

@ -7,6 +7,8 @@ import fr.xephi.authme.security.crypts.description.SaltType;
import fr.xephi.authme.security.crypts.description.Usage; import fr.xephi.authme.security.crypts.description.Usage;
import fr.xephi.authme.util.RandomStringUtils; import fr.xephi.authme.util.RandomStringUtils;
import java.util.Locale;
import static fr.xephi.authme.security.HashUtils.isEqual; import static fr.xephi.authme.security.HashUtils.isEqual;
/** /**
@ -29,7 +31,7 @@ public class Smf implements EncryptionMethod {
@Override @Override
public String computeHash(String password, String salt, String name) { public String computeHash(String password, String salt, String name) {
return HashUtils.sha1(name.toLowerCase() + password); return HashUtils.sha1(name.toLowerCase(Locale.ROOT) + password);
} }
@Override @Override

View File

@ -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.Recommendation;
import fr.xephi.authme.security.crypts.description.Usage; import fr.xephi.authme.security.crypts.description.Usage;
import java.util.Locale;
import static fr.xephi.authme.security.HashUtils.isEqual; import static fr.xephi.authme.security.HashUtils.isEqual;
@Recommendation(Usage.RECOMMENDED) @Recommendation(Usage.RECOMMENDED)
@ -19,7 +21,7 @@ public class XAuth extends HexSaltedMethod {
@Override @Override
public String computeHash(String password, String salt, String name) { 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(); int saltPos = password.length() >= hash.length() ? hash.length() - 1 : password.length();
return hash.substring(0, saltPos) + salt + hash.substring(saltPos); return hash.substring(0, saltPos) + salt + hash.substring(saltPos);
} }

View File

@ -6,6 +6,7 @@ import fr.xephi.authme.util.expiring.ExpiringMap;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import javax.inject.Inject; import javax.inject.Inject;
import java.util.Locale;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
/** /**
@ -32,7 +33,7 @@ public class GenerateTotpService implements HasCleanup {
*/ */
public TotpGenerationResult generateTotpKey(Player player) { public TotpGenerationResult generateTotpKey(Player player) {
TotpGenerationResult credentials = totpAuthenticator.generateTotpKey(player); TotpGenerationResult credentials = totpAuthenticator.generateTotpKey(player);
totpKeys.put(player.getName().toLowerCase(), credentials); totpKeys.put(player.getName().toLowerCase(Locale.ROOT), credentials);
return credentials; return credentials;
} }
@ -43,11 +44,11 @@ public class GenerateTotpService implements HasCleanup {
* @return TOTP generation result * @return TOTP generation result
*/ */
public TotpGenerationResult getGeneratedTotpKey(Player player) { public TotpGenerationResult getGeneratedTotpKey(Player player) {
return totpKeys.get(player.getName().toLowerCase()); return totpKeys.get(player.getName().toLowerCase(Locale.ROOT));
} }
public void removeGenerateTotpKey(Player player) { 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 * @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) { 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); return totpDetails != null && totpAuthenticator.checkCode(player.getName(), totpDetails.getTotpKey(), totpCode);
} }

View File

@ -15,6 +15,8 @@ import org.bukkit.entity.Player;
import javax.inject.Inject; import javax.inject.Inject;
import java.util.Locale;
import static fr.xephi.authme.util.Utils.MILLIS_PER_MINUTE; 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 * @return true if code is valid, false otherwise
*/ */
public boolean checkCode(String playerName, String totpKey, String inputCode) { public boolean checkCode(String playerName, String totpKey, String inputCode) {
String nameLower = playerName.toLowerCase(); String nameLower = playerName.toLowerCase(Locale.ROOT);
Integer totpCode = Ints.tryParse(inputCode); Integer totpCode = Ints.tryParse(inputCode);
if (totpCode != null && !usedCodes.contains(nameLower, totpCode) if (totpCode != null && !usedCodes.contains(nameLower, totpCode)
&& authenticator.authorize(totpKey, totpCode)) { && authenticator.authorize(totpKey, totpCode)) {

View File

@ -11,6 +11,7 @@ import fr.xephi.authme.util.AtomicIntervalCounter;
import org.bukkit.scheduler.BukkitTask; import org.bukkit.scheduler.BukkitTask;
import javax.inject.Inject; import javax.inject.Inject;
import java.util.Locale;
import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.CopyOnWriteArrayList;
import static fr.xephi.authme.service.BukkitService.TICKS_PER_MINUTE; 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 * @return true if the given name has been kicked because of Antibot
*/ */
public boolean wasPlayerKicked(String name) { 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 * @param name the name to add
*/ */
public void addPlayerKick(String name) { public void addPlayerKick(String name) {
antibotKicked.addIfAbsent(name.toLowerCase()); antibotKicked.addIfAbsent(name.toLowerCase(Locale.ROOT));
} }
public enum AntiBotStatus { public enum AntiBotStatus {

View File

@ -18,6 +18,7 @@ import java.io.FileOutputStream;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.io.OutputStream; import java.io.OutputStream;
import java.util.Locale;
import static fr.xephi.authme.util.Utils.logAndSendMessage; import static fr.xephi.authme.util.Utils.logAndSendMessage;
import static fr.xephi.authme.util.Utils.logAndSendWarning; 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 * @return True if the path is correct, false if it is incorrect or the OS is not Windows
*/ */
private boolean useWindowsCommand(String windowsPath) { 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 (isWin.contains("win")) {
if (new File(windowsPath + "\\bin\\mysqldump.exe").exists()) { if (new File(windowsPath + "\\bin\\mysqldump.exe").exists()) {
return true; return true;

View File

@ -20,6 +20,7 @@ import org.bukkit.entity.Player;
import javax.annotation.PostConstruct; import javax.annotation.PostConstruct;
import javax.inject.Inject; import javax.inject.Inject;
import java.util.Locale;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import static fr.xephi.authme.settings.properties.EmailSettings.RECOVERY_PASSWORD_LENGTH; 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); boolean couldSendMail = emailService.sendRecoveryCode(player.getName(), email, recoveryCode);
if (couldSendMail) { if (couldSendMail) {
commonService.send(player, MessageKey.RECOVERY_CODE_SENT); commonService.send(player, MessageKey.RECOVERY_CODE_SENT);
emailCooldown.add(player.getName().toLowerCase()); emailCooldown.add(player.getName().toLowerCase(Locale.ROOT));
} else { } else {
commonService.send(player, MessageKey.EMAIL_SEND_FAILURE); commonService.send(player, MessageKey.EMAIL_SEND_FAILURE);
} }
@ -104,7 +105,7 @@ public class PasswordRecoveryService implements Reloadable, HasCleanup {
boolean couldSendMail = emailService.sendPasswordMail(name, email, thePass); boolean couldSendMail = emailService.sendPasswordMail(name, email, thePass);
if (couldSendMail) { if (couldSendMail) {
commonService.send(player, MessageKey.RECOVERY_EMAIL_SENT_MESSAGE); commonService.send(player, MessageKey.RECOVERY_EMAIL_SENT_MESSAGE);
emailCooldown.add(player.getName().toLowerCase()); emailCooldown.add(player.getName().toLowerCase(Locale.ROOT));
} else { } else {
commonService.send(player, MessageKey.EMAIL_SEND_FAILURE); 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. * @return True if the player is not on cooldown.
*/ */
private boolean checkEmailCooldown(Player player) { 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) { if (waitDuration.getDuration() > 0) {
String durationText = messages.formatDuration(waitDuration); String durationText = messages.formatDuration(waitDuration);
messages.send(player, MessageKey.EMAIL_COOLDOWN_ERROR, durationText); messages.send(player, MessageKey.EMAIL_COOLDOWN_ERROR, durationText);

View File

@ -25,6 +25,7 @@ import javax.annotation.PostConstruct;
import javax.inject.Inject; import javax.inject.Inject;
import java.util.Collection; import java.util.Collection;
import java.util.List; import java.util.List;
import java.util.Locale;
import java.util.Set; import java.util.Set;
import java.util.regex.Pattern; import java.util.regex.Pattern;
@ -69,7 +70,7 @@ public class ValidationService implements Reloadable {
* @return the validation result * @return the validation result
*/ */
public ValidationResult validatePassword(String password, String username) { public ValidationResult validatePassword(String password, String username) {
String passLow = password.toLowerCase(); String passLow = password.toLowerCase(Locale.ROOT);
if (!passwordRegex.matcher(passLow).matches()) { if (!passwordRegex.matcher(passLow).matches()) {
return new ValidationResult(MessageKey.PASSWORD_CHARACTERS_ERROR, passwordRegex.pattern()); return new ValidationResult(MessageKey.PASSWORD_CHARACTERS_ERROR, passwordRegex.pattern());
} else if (passLow.equalsIgnoreCase(username)) { } else if (passLow.equalsIgnoreCase(username)) {
@ -139,7 +140,7 @@ public class ValidationService implements Reloadable {
* @return true if unrestricted, false otherwise * @return true if unrestricted, false otherwise
*/ */
public boolean isUnrestricted(String name) { 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 * @return true if the player may join, false if the player does not satisfy the name restrictions
*/ */
public boolean fulfillsNameRestrictions(Player player) { public boolean fulfillsNameRestrictions(Player player) {
Collection<String> restrictions = restrictedNames.get(player.getName().toLowerCase()); Collection<String> restrictions = restrictedNames.get(player.getName().toLowerCase(Locale.ROOT));
if (Utils.isCollectionEmpty(restrictions)) { if (Utils.isCollectionEmpty(restrictions)) {
return true; return true;
} }
@ -212,7 +213,7 @@ public class ValidationService implements Reloadable {
for (String restriction : configuredRestrictions) { for (String restriction : configuredRestrictions) {
if (isInsideString(';', restriction)) { if (isInsideString(';', restriction)) {
String[] data = restriction.split(";"); String[] data = restriction.split(";");
restrictions.put(data[0].toLowerCase(), data[1]); restrictions.put(data[0].toLowerCase(Locale.ROOT), data[1]);
} else { } else {
logger.warning("Restricted user rule must have a ';' separating name from restriction," logger.warning("Restricted user rule must have a ';' separating name from restriction,"
+ " but found: '" + restriction + "'"); + " but found: '" + restriction + "'");

View File

@ -13,6 +13,7 @@ import org.bukkit.entity.Player;
import org.bukkit.plugin.messaging.Messenger; import org.bukkit.plugin.messaging.Messenger;
import javax.inject.Inject; import javax.inject.Inject;
import java.util.Locale;
public class BungeeSender implements SettingsDependent { public class BungeeSender implements SettingsDependent {
@ -103,9 +104,9 @@ public class BungeeSender implements SettingsDependent {
return; return;
} }
if (type.isBroadcast()) { 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 { } else {
sendBungeecordMessage(player, "AuthMe.v2", type.getId(), player.getName().toLowerCase()); sendBungeecordMessage(player, "AuthMe.v2", type.getId(), player.getName().toLowerCase(Locale.ROOT));
} }
} }

View File

@ -19,6 +19,7 @@ import org.bukkit.entity.Player;
import javax.inject.Inject; import javax.inject.Inject;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.util.Locale;
/** /**
* Manager for spawn points. It loads spawn definitions from AuthMe and third-party plugins * 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(); World world = player.getWorld();
Location spawnLoc = null; Location spawnLoc = null;
for (String priority : spawnPriority) { for (String priority : spawnPriority) {
switch (priority.toLowerCase().trim()) { switch (priority.toLowerCase(Locale.ROOT).trim()) {
case "default": case "default":
if (world.getSpawnLocation() != null) { if (world.getSpawnLocation() != null) {
if (!isValidSpawnPoint(world.getSpawnLocation())) { if (!isValidSpawnPoint(world.getSpawnLocation())) {

View File

@ -15,6 +15,7 @@ import org.bukkit.Server;
import javax.inject.Inject; import javax.inject.Inject;
import java.io.File; import java.io.File;
import java.util.Collection; import java.util.Collection;
import java.util.Locale;
import static fr.xephi.authme.util.FileUtils.makePath; import static fr.xephi.authme.util.FileUtils.makePath;
@ -80,7 +81,7 @@ public class PurgeExecutor {
} }
for (String file : dataFolder.list()) { for (String file : dataFolder.list()) {
if (cleared.contains(file.toLowerCase())) { if (cleared.contains(file.toLowerCase(Locale.ROOT))) {
File playerFile = new File(dataFolder, file); File playerFile = new File(dataFolder, file);
if (playerFile.exists() && playerFile.delete()) { if (playerFile.exists() && playerFile.delete()) {
i++; i++;
@ -137,7 +138,7 @@ public class PurgeExecutor {
if (name.equals(file)) { if (name.equals(file)) {
continue; continue;
} }
if (cleared.contains(name.toLowerCase())) { if (cleared.contains(name.toLowerCase(Locale.ROOT))) {
File dataFile = new File(dataFolder, file); File dataFile = new File(dataFolder, file);
if (dataFile.exists() && dataFile.delete()) { if (dataFile.exists() && dataFile.delete()) {
i++; i++;

View File

@ -12,6 +12,7 @@ import org.bukkit.entity.Player;
import org.bukkit.scheduler.BukkitRunnable; import org.bukkit.scheduler.BukkitRunnable;
import java.util.HashSet; import java.util.HashSet;
import java.util.Locale;
import java.util.Set; import java.util.Set;
import java.util.UUID; import java.util.UUID;
@ -74,7 +75,7 @@ class PurgeTask extends BukkitRunnable {
} }
OfflinePlayer offlinePlayer = offlinePlayers[nextPosition]; 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)) { if (!permissionsManager.loadUserData(offlinePlayer)) {
logger.warning("Unable to check if the user " + offlinePlayer.getName() + " can be purged!"); logger.warning("Unable to check if the user " + offlinePlayer.getName() + " can be purged!");
continue; continue;

View File

@ -28,6 +28,7 @@ import java.time.Instant;
import java.util.Arrays; import java.util.Arrays;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
import java.util.Locale;
import java.util.Optional; import java.util.Optional;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@ -457,7 +458,7 @@ public class AuthMeApiTest {
String name = "Marco"; String name = "Marco";
String password = "myP4ss"; String password = "myP4ss";
HashedPassword hashedPassword = new HashedPassword("0395872SLKDFJOWEIUTEJSD"); 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); given(dataSource.saveAuth(any(PlayerAuth.class))).willReturn(true);
// when // when
@ -465,10 +466,10 @@ public class AuthMeApiTest {
// then // then
assertThat(result, equalTo(true)); assertThat(result, equalTo(true));
verify(passwordSecurity).computeHash(password, name.toLowerCase()); verify(passwordSecurity).computeHash(password, name.toLowerCase(Locale.ROOT));
ArgumentCaptor<PlayerAuth> authCaptor = ArgumentCaptor.forClass(PlayerAuth.class); ArgumentCaptor<PlayerAuth> authCaptor = ArgumentCaptor.forClass(PlayerAuth.class);
verify(dataSource).saveAuth(authCaptor.capture()); 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().getRealName(), equalTo(name));
assertThat(authCaptor.getValue().getPassword(), equalTo(hashedPassword)); assertThat(authCaptor.getValue().getPassword(), equalTo(hashedPassword));
} }

View File

@ -9,6 +9,7 @@ import java.util.Collection;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Locale;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.function.BiConsumer; import java.util.function.BiConsumer;
@ -90,7 +91,7 @@ public class CommandInitializerTest {
@Override @Override
public void accept(CommandDescription command, Integer depth) { public void accept(CommandDescription command, Integer depth) {
for (String label : command.getLabels()) { for (String label : command.getLabels()) {
if (!label.equals(label.toLowerCase())) { if (!label.equals(label.toLowerCase(Locale.ROOT))) {
fail("Label '" + label + "' should be lowercase"); fail("Label '" + label + "' should be lowercase");
} else if (invalidPattern.matcher(label).matches()) { } else if (invalidPattern.matcher(label).matches()) {
fail("Label '" + label + "' has whitespace"); fail("Label '" + label + "' has whitespace");

View File

@ -17,6 +17,7 @@ import org.mockito.junit.MockitoJUnitRunner;
import java.util.Collections; import java.util.Collections;
import java.util.HashSet; import java.util.HashSet;
import java.util.Locale;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
@ -129,7 +130,7 @@ public class ConverterCommandTest {
setBukkitServiceToRunTaskAsynchronously(bukkitService); setBukkitServiceToRunTaskAsynchronously(bukkitService);
// when // when
command.executeCommand(sender, Collections.singletonList(converterName.toUpperCase())); command.executeCommand(sender, Collections.singletonList(converterName.toUpperCase(Locale.ROOT)));
// then // then
verify(converter).execute(sender); verify(converter).execute(sender);

View File

@ -12,6 +12,7 @@ import org.mockito.junit.MockitoJUnitRunner;
import java.util.Collections; import java.util.Collections;
import java.util.HashSet; import java.util.HashSet;
import java.util.Locale;
import java.util.Set; import java.util.Set;
import static com.google.common.collect.Sets.newHashSet; import static com.google.common.collect.Sets.newHashSet;
@ -67,7 +68,7 @@ public class PurgeBannedPlayersCommandTest {
private static Set<String> asLowerCaseSet(String... items) { private static Set<String> asLowerCaseSet(String... items) {
Set<String> result = new HashSet<>(items.length); Set<String> result = new HashSet<>(items.length);
for (String item : items) { for (String item : items) {
result.add(item.toLowerCase()); result.add(item.toLowerCase(Locale.ROOT));
} }
return result; return result;
} }

View File

@ -11,6 +11,8 @@ import org.mockito.InjectMocks;
import org.mockito.Mock; import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner; import org.mockito.junit.MockitoJUnitRunner;
import java.util.Locale;
import static fr.xephi.authme.service.BukkitServiceTestHelper.setBukkitServiceToRunTaskAsynchronously; import static fr.xephi.authme.service.BukkitServiceTestHelper.setBukkitServiceToRunTaskAsynchronously;
import static fr.xephi.authme.service.BukkitServiceTestHelper.setBukkitServiceToRunTaskOptionallyAsync; import static fr.xephi.authme.service.BukkitServiceTestHelper.setBukkitServiceToRunTaskOptionallyAsync;
import static java.util.Arrays.asList; import static java.util.Arrays.asList;
@ -71,7 +73,7 @@ public class PurgePlayerCommandTest {
// then // then
verify(dataSource).isAuthAvailable(name); verify(dataSource).isAuthAvailable(name);
verify(purgeExecutor).executePurge(singletonList(player), singletonList(name.toLowerCase())); verify(purgeExecutor).executePurge(singletonList(player), singletonList(name.toLowerCase(Locale.ROOT)));
} }
@Test @Test
@ -87,6 +89,6 @@ public class PurgePlayerCommandTest {
command.executeCommand(sender, asList(name, "force")); command.executeCommand(sender, asList(name, "force"));
// then // then
verify(purgeExecutor).executePurge(singletonList(player), singletonList(name.toLowerCase())); verify(purgeExecutor).executePurge(singletonList(player), singletonList(name.toLowerCase(Locale.ROOT)));
} }
} }

View File

@ -21,6 +21,7 @@ import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner; import org.mockito.junit.MockitoJUnitRunner;
import java.util.Arrays; import java.util.Arrays;
import java.util.Locale;
import static fr.xephi.authme.service.BukkitServiceTestHelper.setBukkitServiceToRunTaskOptionallyAsync; import static fr.xephi.authme.service.BukkitServiceTestHelper.setBukkitServiceToRunTaskOptionallyAsync;
import static fr.xephi.authme.service.BukkitServiceTestHelper.setBukkitServiceToScheduleSyncTaskFromOptionallyAsyncTask; import static fr.xephi.authme.service.BukkitServiceTestHelper.setBukkitServiceToScheduleSyncTaskFromOptionallyAsyncTask;
@ -179,7 +180,7 @@ public class RegisterAdminCommandTest {
private void assertAuthHasInfo(PlayerAuth auth, String name, HashedPassword hashedPassword) { private void assertAuthHasInfo(PlayerAuth auth, String name, HashedPassword hashedPassword) {
assertThat(auth.getRealName(), equalTo(name)); assertThat(auth.getRealName(), equalTo(name));
assertThat(auth.getNickname(), equalTo(name.toLowerCase())); assertThat(auth.getNickname(), equalTo(name.toLowerCase(Locale.ROOT)));
assertThat(auth.getPassword(), equalTo(hashedPassword)); assertThat(auth.getPassword(), equalTo(hashedPassword));
} }
} }

View File

@ -16,6 +16,7 @@ import org.mockito.junit.MockitoJUnitRunner;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
import java.util.Locale;
import static com.google.common.base.Preconditions.checkArgument; import static com.google.common.base.Preconditions.checkArgument;
import static java.util.Collections.emptyList; import static java.util.Collections.emptyList;
@ -125,7 +126,7 @@ public class DebugCommandTest {
CommandSender sender = mock(CommandSender.class); CommandSender sender = mock(CommandSender.class);
given(permissionsManager.hasPermission(sender, section.getRequiredPermission())).willReturn(true); given(permissionsManager.hasPermission(sender, section.getRequiredPermission())).willReturn(true);
List<String> arguments = Arrays.asList(section.getName().toUpperCase(), "test", "toast"); List<String> arguments = Arrays.asList(section.getName().toUpperCase(Locale.ROOT), "test", "toast");
// when // when
command.executeCommand(sender, arguments); command.executeCommand(sender, arguments);
@ -144,7 +145,7 @@ public class DebugCommandTest {
CommandSender sender = mock(CommandSender.class); CommandSender sender = mock(CommandSender.class);
given(permissionsManager.hasPermission(sender, section.getRequiredPermission())).willReturn(false); given(permissionsManager.hasPermission(sender, section.getRequiredPermission())).willReturn(false);
List<String> arguments = Arrays.asList(section.getName().toUpperCase(), "test"); List<String> arguments = Arrays.asList(section.getName().toUpperCase(Locale.ROOT), "test");
// when // when
command.executeCommand(sender, arguments); command.executeCommand(sender, arguments);

View File

@ -22,6 +22,7 @@ import org.junit.runner.RunWith;
import org.mockito.Mock; import org.mockito.Mock;
import java.util.Collections; import java.util.Collections;
import java.util.Locale;
import static fr.xephi.authme.service.BukkitServiceTestHelper.setBukkitServiceToRunTaskAsynchronously; import static fr.xephi.authme.service.BukkitServiceTestHelper.setBukkitServiceToRunTaskAsynchronously;
import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.equalTo;
@ -187,7 +188,7 @@ public class RecoverEmailCommandTest {
setBukkitServiceToRunTaskAsynchronously(bukkitService); setBukkitServiceToRunTaskAsynchronously(bukkitService);
// when // when
command.executeCommand(sender, Collections.singletonList(email.toUpperCase())); command.executeCommand(sender, Collections.singletonList(email.toUpperCase(Locale.ROOT)));
// then // then
verify(emailService).hasAllInformation(); verify(emailService).hasAllInformation();

View File

@ -23,6 +23,7 @@ import java.util.Arrays;
import java.util.Collection; import java.util.Collection;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.Locale;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import static fr.xephi.authme.command.TestCommandsUtil.getCommandWithLabel; import static fr.xephi.authme.command.TestCommandsUtil.getCommandWithLabel;
@ -446,19 +447,19 @@ public class HelpProviderTest {
given(helpMessagesService.buildLocalizedDescription(any(CommandDescription.class))) given(helpMessagesService.buildLocalizedDescription(any(CommandDescription.class)))
.willAnswer(new ReturnsArgumentAt(0)); .willAnswer(new ReturnsArgumentAt(0));
for (HelpMessage key : HelpMessage.values()) { for (HelpMessage key : HelpMessage.values()) {
String text = key.name().replace("_", " ").toLowerCase(); String text = key.name().replace("_", " ").toLowerCase(Locale.ROOT);
given(helpMessagesService.getMessage(key)) 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()) { for (DefaultPermission permission : DefaultPermission.values()) {
String text = permission.name().replace("_", " ").toLowerCase(); String text = permission.name().replace("_", " ").toLowerCase(Locale.ROOT);
given(helpMessagesService.getMessage(permission)) 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()) { for (HelpSection section : HelpSection.values()) {
String text = section.name().replace("_", " ").toLowerCase(); String text = section.name().replace("_", " ").toLowerCase(Locale.ROOT);
given(helpMessagesService.getMessage(section)) given(helpMessagesService.getMessage(section))
.willReturn(text.substring(0, 1).toUpperCase() + text.substring(1)); .willReturn(text.substring(0, 1).toUpperCase(Locale.ROOT) + text.substring(1));
} }
} }

View File

@ -7,6 +7,8 @@ import fr.xephi.authme.util.expiring.TimedCounter;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.junit.Test; import org.junit.Test;
import java.util.Locale;
import static fr.xephi.authme.AuthMeMatchers.stringWithLength; import static fr.xephi.authme.AuthMeMatchers.stringWithLength;
import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.equalTo;
import static org.hamcrest.Matchers.not; import static org.hamcrest.Matchers.not;
@ -34,7 +36,7 @@ public class LoginCaptchaManagerTest {
// then // then
assertThat(manager.isCaptchaRequired(player), equalTo(false)); assertThat(manager.isCaptchaRequired(player), equalTo(false));
manager.increaseLoginFailureCount(player); 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)); assertThat(manager.isCaptchaRequired("otherPlayer"), equalTo(false));
} }
@ -167,6 +169,6 @@ public class LoginCaptchaManagerTest {
private static void assertHasCount(LoginCaptchaManager manager, String player, Integer count) { private static void assertHasCount(LoginCaptchaManager manager, String player, Integer count) {
TimedCounter<String> playerCounts = ReflectionTestUtils TimedCounter<String> playerCounts = ReflectionTestUtils
.getFieldValue(LoginCaptchaManager.class, manager, "playerCounts"); .getFieldValue(LoginCaptchaManager.class, manager, "playerCounts");
assertThat(playerCounts.get(player.toLowerCase()), equalTo(count)); assertThat(playerCounts.get(player.toLowerCase(Locale.ROOT)), equalTo(count));
} }
} }

View File

@ -27,6 +27,7 @@ import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer; import org.mockito.stubbing.Answer;
import java.util.Collections; import java.util.Collections;
import java.util.Locale;
import java.util.Set; import java.util.Set;
import static com.google.common.collect.Sets.newHashSet; import static com.google.common.collect.Sets.newHashSet;
@ -118,7 +119,7 @@ public class PasswordSecurityTest {
HashedPassword password = new HashedPassword("$TEST$10$SOME_HASH", null); HashedPassword password = new HashedPassword("$TEST$10$SOME_HASH", null);
String playerName = "Tester"; String playerName = "Tester";
// Calls to EncryptionMethod are always with the lower-case version of the name // 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"; String clearTextPass = "myPassTest";
given(dataSource.getPassword(playerName)).willReturn(password); given(dataSource.getPassword(playerName)).willReturn(password);
@ -139,7 +140,7 @@ public class PasswordSecurityTest {
// given // given
HashedPassword password = new HashedPassword("$TEST$10$SOME_HASH", null); HashedPassword password = new HashedPassword("$TEST$10$SOME_HASH", null);
String playerName = "My_PLayer"; String playerName = "My_PLayer";
String playerLowerCase = playerName.toLowerCase(); String playerLowerCase = playerName.toLowerCase(Locale.ROOT);
String clearTextPass = "passw0Rd1"; String clearTextPass = "passw0Rd1";
given(dataSource.getPassword(playerName)).willReturn(password); given(dataSource.getPassword(playerName)).willReturn(password);
@ -178,7 +179,7 @@ public class PasswordSecurityTest {
HashedPassword password = HashedPassword password =
new HashedPassword("$2y$10$2e6d2193f43501c926e25elvWlPmWczmrfrnbZV0dUZGITjYjnkkW"); new HashedPassword("$2y$10$2e6d2193f43501c926e25elvWlPmWczmrfrnbZV0dUZGITjYjnkkW");
String playerName = "somePlayer"; String playerName = "somePlayer";
String playerLowerCase = playerName.toLowerCase(); String playerLowerCase = playerName.toLowerCase(Locale.ROOT);
String clearTextPass = "Test"; String clearTextPass = "Test";
// MD5 hash for "Test" // MD5 hash for "Test"
HashedPassword newPassword = new HashedPassword("0cbc6611f5540bd0809a388dc95a615b"); HashedPassword newPassword = new HashedPassword("0cbc6611f5540bd0809a388dc95a615b");
@ -230,7 +231,7 @@ public class PasswordSecurityTest {
// given // given
String password = "MyP@ssword"; String password = "MyP@ssword";
String username = "theUserInTest"; String username = "theUserInTest";
String usernameLowerCase = username.toLowerCase(); String usernameLowerCase = username.toLowerCase(Locale.ROOT);
HashedPassword hashedPassword = new HashedPassword("$T$est#Hash", "__someSalt__"); HashedPassword hashedPassword = new HashedPassword("$T$est#Hash", "__someSalt__");
given(method.computeHash(password, usernameLowerCase)).willReturn(hashedPassword); given(method.computeHash(password, usernameLowerCase)).willReturn(hashedPassword);
given(settings.getProperty(SecuritySettings.PASSWORD_HASH)).willReturn(HashAlgorithm.JOOMLA); given(settings.getProperty(SecuritySettings.PASSWORD_HASH)).willReturn(HashAlgorithm.JOOMLA);

View File

@ -8,6 +8,7 @@ import org.junit.BeforeClass;
import org.junit.Test; import org.junit.Test;
import java.util.List; import java.util.List;
import java.util.Locale;
import java.util.Map; import java.util.Map;
import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.equalTo;
@ -154,13 +155,13 @@ public abstract class AbstractEncryptionMethodTest {
method.comparePassword(password, hashedPassword, USERNAME)); method.comparePassword(password, hashedPassword, USERNAME));
assumeThat(SKIP_LONG_TESTS, equalTo(false)); 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 + "'", 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 + "'", 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));
} }
} }
} }

View File

@ -15,6 +15,7 @@ import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner; import org.mockito.junit.MockitoJUnitRunner;
import java.util.Arrays; import java.util.Arrays;
import java.util.Locale;
import static fr.xephi.authme.AuthMeMatchers.equalToHash; import static fr.xephi.authme.AuthMeMatchers.equalToHash;
import static org.hamcrest.Matchers.equalToIgnoringCase; import static org.hamcrest.Matchers.equalToIgnoringCase;
@ -118,7 +119,7 @@ public class MigrationServiceTest {
private static void setSha256MockToUppercase(Sha256 sha256) { private static void setSha256MockToUppercase(Sha256 sha256) {
given(sha256.computeHash(anyString(), anyString())).willAnswer(invocation -> { given(sha256.computeHash(anyString(), anyString())).willAnswer(invocation -> {
String plainPassword = invocation.getArgument(0); String plainPassword = invocation.getArgument(0);
return new HashedPassword(plainPassword.toUpperCase(), null); return new HashedPassword(plainPassword.toUpperCase(Locale.ROOT), null);
}); });
} }
} }

View File

@ -7,6 +7,7 @@ import tools.utils.TagValue.NestedTagValue;
import tools.utils.TagValueHolder; import tools.utils.TagValueHolder;
import tools.utils.ToolsConstants; import tools.utils.ToolsConstants;
import java.util.Locale;
import java.util.Map; 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" // Get the enum name and replace something like "DO_NOT_USE" to "Do not use"
String enumName = value.toString().replace("_", " "); String enumName = value.toString().replace("_", " ");
return enumName.length() > 2 return enumName.length() > 2
? enumName.substring(0, 1) + enumName.substring(1).toLowerCase() ? enumName.substring(0, 1) + enumName.substring(1).toLowerCase(Locale.ROOT)
: enumName; : enumName;
} }