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
@@ -4,6 +4,7 @@ import fr.xephi.authme.initialization.HasCleanup;
import fr.xephi.authme.util.expiring.ExpiringSet;
import javax.inject.Inject;
import java.util.Locale;
import java.util.concurrent.TimeUnit;
public class ProxySessionManager implements HasCleanup {
@@ -21,7 +22,7 @@ public class ProxySessionManager implements HasCleanup {
* @param name the player's name
*/
private void setActiveSession(String name) {
activeProxySessions.add(name.toLowerCase());
activeProxySessions.add(name.toLowerCase(Locale.ROOT));
}
/**
@@ -16,6 +16,7 @@ import org.bukkit.entity.Player;
import javax.inject.Inject;
import java.util.HashSet;
import java.util.Locale;
import java.util.Set;
import java.util.concurrent.TimeUnit;
@@ -82,7 +83,7 @@ public class VerificationCodeManager implements SettingsDependent, HasCleanup {
* @return true if the player has been verified, false otherwise
*/
private boolean isPlayerVerified(String name) {
return verifiedPlayers.contains(name.toLowerCase());
return verifiedPlayers.contains(name.toLowerCase(Locale.ROOT));
}
/**
@@ -92,7 +93,7 @@ public class VerificationCodeManager implements SettingsDependent, HasCleanup {
* @return true if the code exists, false otherwise
*/
public boolean hasCode(String name) {
return (verificationCodes.get(name.toLowerCase()) != null);
return (verificationCodes.get(name.toLowerCase(Locale.ROOT)) != null);
}
/**
@@ -135,7 +136,7 @@ public class VerificationCodeManager implements SettingsDependent, HasCleanup {
final String email = emailResult.getValue();
if (!Utils.isEmailEmpty(email)) {
String code = RandomStringUtils.generateNum(6); // 6 digits code
verificationCodes.put(name.toLowerCase(), code);
verificationCodes.put(name.toLowerCase(Locale.ROOT), code);
emailService.sendVerificationMail(name, email, code);
}
}
@@ -150,7 +151,7 @@ public class VerificationCodeManager implements SettingsDependent, HasCleanup {
*/
public boolean checkCode(String name, String code) {
boolean correct = false;
if (code.equals(verificationCodes.get(name.toLowerCase()))) {
if (code.equals(verificationCodes.get(name.toLowerCase(Locale.ROOT)))) {
verify(name);
correct = true;
}
@@ -163,7 +164,7 @@ public class VerificationCodeManager implements SettingsDependent, HasCleanup {
* @param name the name of the player to generate a code for
*/
public void verify(String name) {
verifiedPlayers.add(name.toLowerCase());
verifiedPlayers.add(name.toLowerCase(Locale.ROOT));
}
/**
@@ -172,7 +173,7 @@ public class VerificationCodeManager implements SettingsDependent, HasCleanup {
* @param name the name of the player to generate a code for
*/
public void unverify(String name){
verifiedPlayers.remove(name.toLowerCase());
verifiedPlayers.remove(name.toLowerCase(Locale.ROOT));
}
@Override
@@ -3,6 +3,7 @@ package fr.xephi.authme.data.auth;
import fr.xephi.authme.security.crypts.HashedPassword;
import org.bukkit.Location;
import java.util.Locale;
import java.util.Objects;
import java.util.Optional;
import java.util.UUID;
@@ -54,7 +55,7 @@ public class PlayerAuth {
public void setNickname(String nickname) {
this.nickname = nickname.toLowerCase();
this.nickname = nickname.toLowerCase(Locale.ROOT);
}
public String getNickname() {
@@ -239,7 +240,7 @@ public class PlayerAuth {
*/
public PlayerAuth build() {
PlayerAuth auth = new PlayerAuth();
auth.nickname = checkNotNull(name).toLowerCase();
auth.nickname = checkNotNull(name).toLowerCase(Locale.ROOT);
auth.realName = Optional.ofNullable(realName).orElse("Player");
auth.password = Optional.ofNullable(password).orElse(new HashedPassword(""));
auth.totpKey = totpKey;
@@ -1,6 +1,7 @@
package fr.xephi.authme.data.auth;
import java.util.Locale;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
@@ -20,7 +21,7 @@ public class PlayerCache {
* @param auth the player auth object to save
*/
public void updatePlayer(PlayerAuth auth) {
cache.put(auth.getNickname().toLowerCase(), auth);
cache.put(auth.getNickname().toLowerCase(Locale.ROOT), auth);
}
/**
@@ -29,7 +30,7 @@ public class PlayerCache {
* @param user name of the player to remove
*/
public void removePlayer(String user) {
cache.remove(user.toLowerCase());
cache.remove(user.toLowerCase(Locale.ROOT));
}
/**
@@ -40,7 +41,7 @@ public class PlayerCache {
* @return true if player is logged in, false otherwise.
*/
public boolean isAuthenticated(String user) {
return cache.containsKey(user.toLowerCase());
return cache.containsKey(user.toLowerCase(Locale.ROOT));
}
/**
@@ -51,7 +52,7 @@ public class PlayerCache {
* @return the associated auth object, or null if not available
*/
public PlayerAuth getAuth(String user) {
return cache.get(user.toLowerCase());
return cache.get(user.toLowerCase(Locale.ROOT));
}
/**
@@ -3,6 +3,7 @@ package fr.xephi.authme.data.captcha;
import fr.xephi.authme.util.RandomStringUtils;
import fr.xephi.authme.util.expiring.ExpiringMap;
import java.util.Locale;
import java.util.concurrent.TimeUnit;
/**
@@ -51,7 +52,7 @@ public class CaptchaCodeStorage {
* @return the code the player is required to enter
*/
public String getCodeOrGenerateNew(String name) {
String code = captchaCodes.get(name.toLowerCase());
String code = captchaCodes.get(name.toLowerCase(Locale.ROOT));
return code == null ? generateCode(name) : code;
}
@@ -63,7 +64,7 @@ public class CaptchaCodeStorage {
*/
private String generateCode(String name) {
String code = RandomStringUtils.generate(captchaLength);
captchaCodes.put(name.toLowerCase(), code);
captchaCodes.put(name.toLowerCase(Locale.ROOT), code);
return code;
}
@@ -76,7 +77,7 @@ public class CaptchaCodeStorage {
* @return true if the code matches, false otherwise
*/
public boolean checkCode(String name, String code) {
String nameLowerCase = name.toLowerCase();
String nameLowerCase = name.toLowerCase(Locale.ROOT);
String savedCode = captchaCodes.get(nameLowerCase);
if (savedCode != null && savedCode.equalsIgnoreCase(code)) {
captchaCodes.remove(nameLowerCase);
@@ -8,6 +8,7 @@ import fr.xephi.authme.util.expiring.TimedCounter;
import org.bukkit.entity.Player;
import javax.inject.Inject;
import java.util.Locale;
import java.util.concurrent.TimeUnit;
/**
@@ -36,14 +37,14 @@ public class LoginCaptchaManager implements CaptchaManager, SettingsDependent, H
*/
public void increaseLoginFailureCount(String name) {
if (isEnabled) {
String playerLower = name.toLowerCase();
String playerLower = name.toLowerCase(Locale.ROOT);
playerCounts.increment(playerLower);
}
}
@Override
public boolean isCaptchaRequired(String playerName) {
return isEnabled && playerCounts.get(playerName.toLowerCase()) >= threshold;
return isEnabled && playerCounts.get(playerName.toLowerCase(Locale.ROOT)) >= threshold;
}
@Override
@@ -53,7 +54,7 @@ public class LoginCaptchaManager implements CaptchaManager, SettingsDependent, H
@Override
public boolean checkCode(Player player, String code) {
String nameLower = player.getName().toLowerCase();
String nameLower = player.getName().toLowerCase(Locale.ROOT);
boolean isCodeCorrect = captchaCodeStorage.checkCode(nameLower, code);
if (isCodeCorrect) {
playerCounts.remove(nameLower);
@@ -68,7 +69,7 @@ public class LoginCaptchaManager implements CaptchaManager, SettingsDependent, H
*/
public void resetLoginFailureCount(String name) {
if (isEnabled) {
playerCounts.remove(name.toLowerCase());
playerCounts.remove(name.toLowerCase(Locale.ROOT));
}
}
@@ -8,6 +8,7 @@ import fr.xephi.authme.util.expiring.ExpiringSet;
import org.bukkit.entity.Player;
import javax.inject.Inject;
import java.util.Locale;
import java.util.concurrent.TimeUnit;
/**
@@ -31,7 +32,7 @@ public class RegistrationCaptchaManager implements CaptchaManager, SettingsDepen
@Override
public boolean isCaptchaRequired(String name) {
return isEnabled && !verifiedNamesForRegistration.contains(name.toLowerCase());
return isEnabled && !verifiedNamesForRegistration.contains(name.toLowerCase(Locale.ROOT));
}
@Override
@@ -41,7 +42,7 @@ public class RegistrationCaptchaManager implements CaptchaManager, SettingsDepen
@Override
public boolean checkCode(Player player, String code) {
String nameLower = player.getName().toLowerCase();
String nameLower = player.getName().toLowerCase(Locale.ROOT);
boolean isCodeCorrect = captchaCodeStorage.checkCode(nameLower, code);
if (isCodeCorrect) {
verifiedNamesForRegistration.add(nameLower);
@@ -9,6 +9,7 @@ import org.bukkit.Location;
import org.bukkit.entity.Player;
import javax.inject.Inject;
import java.util.Locale;
import java.util.Map;
import java.util.Optional;
import java.util.concurrent.ConcurrentHashMap;
@@ -55,7 +56,7 @@ public class LimboService {
* @param isRegistered whether or not the player is registered
*/
public void createLimboPlayer(Player player, boolean isRegistered) {
final String name = player.getName().toLowerCase();
final String name = player.getName().toLowerCase(Locale.ROOT);
LimboPlayer limboFromDisk = persistence.getLimboPlayer(player);
if (limboFromDisk != null) {
@@ -89,7 +90,7 @@ public class LimboService {
* @return the associated limbo player, or null if none available
*/
public LimboPlayer getLimboPlayer(String name) {
return entries.get(name.toLowerCase());
return entries.get(name.toLowerCase(Locale.ROOT));
}
/**
@@ -99,7 +100,7 @@ public class LimboService {
* @return true if present, false otherwise
*/
public boolean hasLimboPlayer(String name) {
return entries.containsKey(name.toLowerCase());
return entries.containsKey(name.toLowerCase(Locale.ROOT));
}
/**
@@ -111,7 +112,7 @@ public class LimboService {
* @param player the player whose data should be restored
*/
public void restoreData(Player player) {
String lowerName = player.getName().toLowerCase();
String lowerName = player.getName().toLowerCase(Locale.ROOT);
LimboPlayer limbo = entries.remove(lowerName);
if (limbo == null) {
@@ -178,7 +179,7 @@ public class LimboService {
* @return Optional with the limbo player
*/
private Optional<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) {
logger.debug("No LimboPlayer found for `{0}`. Action: {1}", player.getName(), context);
}