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
@@ -14,6 +14,7 @@ import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import javax.inject.Inject;
import java.util.Locale;
public class AsyncChangePassword implements AsynchronousProcess {
@@ -42,7 +43,7 @@ public class AsyncChangePassword implements AsynchronousProcess {
* @param newPassword the new password chosen by the player
*/
public void changePassword(Player player, String oldPassword, String newPassword) {
String name = player.getName().toLowerCase();
String name = player.getName().toLowerCase(Locale.ROOT);
PlayerAuth auth = playerCache.getAuth(name);
if (passwordSecurity.comparePassword(oldPassword, auth.getPassword(), player.getName())) {
HashedPassword hashedPassword = passwordSecurity.computeHash(newPassword, name);
@@ -71,7 +72,7 @@ public class AsyncChangePassword implements AsynchronousProcess {
* @param newPassword the new password chosen for the player
*/
public void changePasswordAsAdmin(CommandSender sender, String playerName, String newPassword) {
String lowerCaseName = playerName.toLowerCase();
String lowerCaseName = playerName.toLowerCase(Locale.ROOT);
if (!(playerCache.isAuthenticated(lowerCaseName) || dataSource.isAuthAvailable(lowerCaseName))) {
if (sender == null) {
logger.warning("Tried to change password for user " + lowerCaseName + " but it doesn't exist!");
@@ -15,6 +15,7 @@ import fr.xephi.authme.util.Utils;
import org.bukkit.entity.Player;
import javax.inject.Inject;
import java.util.Locale;
/**
* Async task to add an email to an account.
@@ -48,7 +49,7 @@ public class AsyncAddEmail implements AsynchronousProcess {
* @param email the email to add
*/
public void addEmail(Player player, String email) {
String playerName = player.getName().toLowerCase();
String playerName = player.getName().toLowerCase(Locale.ROOT);
if (playerCache.isAuthenticated(playerName)) {
PlayerAuth auth = playerCache.getAuth(playerName);
@@ -14,6 +14,7 @@ import fr.xephi.authme.service.ValidationService;
import org.bukkit.entity.Player;
import javax.inject.Inject;
import java.util.Locale;
/**
* Async task for changing the email.
@@ -48,7 +49,7 @@ public class AsyncChangeEmail implements AsynchronousProcess {
* @param newEmail provided new email
*/
public void changeEmail(Player player, String oldEmail, String newEmail) {
String playerName = player.getName().toLowerCase();
String playerName = player.getName().toLowerCase(Locale.ROOT);
if (playerCache.isAuthenticated(playerName)) {
PlayerAuth auth = playerCache.getAuth(playerName);
String currentEmail = auth.getEmail();
@@ -32,6 +32,8 @@ import org.bukkit.potion.PotionEffectType;
import javax.inject.Inject;
import java.util.Locale;
import static fr.xephi.authme.service.BukkitService.TICKS_PER_SECOND;
import static fr.xephi.authme.settings.properties.RestrictionSettings.PROTECT_INVENTORY_BEFORE_LOGIN;
@@ -90,7 +92,7 @@ public class AsynchronousJoin implements AsynchronousProcess {
* @param player the player to process
*/
public void processJoin(Player player) {
String name = player.getName().toLowerCase();
String name = player.getName().toLowerCase(Locale.ROOT);
String ip = PlayerUtils.getPlayerIp(player);
if (!validationService.fulfillsNameRestrictions(player)) {
@@ -40,6 +40,7 @@ import org.bukkit.entity.Player;
import javax.inject.Inject;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
/**
* Asynchronous task for a player login.
@@ -153,7 +154,7 @@ public class AsynchronousLogin implements AsynchronousProcess {
* (e.g. because he is already logged in)
*/
private PlayerAuth getPlayerAuth(Player player, boolean quiet) {
String name = player.getName().toLowerCase();
String name = player.getName().toLowerCase(Locale.ROOT);
if (playerCache.isAuthenticated(name)) {
if (!quiet) {
service.send(player, MessageKey.ALREADY_LOGGED_IN_ERROR);
@@ -206,7 +207,7 @@ public class AsynchronousLogin implements AsynchronousProcess {
* false otherwise
*/
private boolean checkPlayerInfo(Player player, PlayerAuth auth, String password) {
String name = player.getName().toLowerCase();
String name = player.getName().toLowerCase(Locale.ROOT);
// If captcha is required send a message to the player and deny to log in
if (loginCaptchaManager.isCaptchaRequired(name)) {
@@ -380,7 +381,7 @@ public class AsynchronousLogin implements AsynchronousProcess {
for (Player onlinePlayer : bukkitService.getOnlinePlayers()) {
if (ip.equalsIgnoreCase(PlayerUtils.getPlayerIp(onlinePlayer))
&& !onlinePlayer.getName().equals(name)
&& dataSource.isLogged(onlinePlayer.getName().toLowerCase())) {
&& dataSource.isLogged(onlinePlayer.getName().toLowerCase(Locale.ROOT))) {
++count;
}
}
@@ -22,6 +22,7 @@ import org.bukkit.potion.PotionEffectType;
import javax.inject.Inject;
import java.util.List;
import java.util.Locale;
import static fr.xephi.authme.settings.properties.RestrictionSettings.PROTECT_INVENTORY_BEFORE_LOGIN;
@@ -76,7 +77,7 @@ public class ProcessSyncPlayerLogin implements SynchronousProcess {
* @param authsWithSameIp registered names with the same IP address as the player's
*/
public void processPlayerLogin(Player player, boolean isFirstLogin, List<String> authsWithSameIp) {
final String name = player.getName().toLowerCase();
final String name = player.getName().toLowerCase(Locale.ROOT);
final LimboPlayer limbo = limboService.getLimboPlayer(name);
// Limbo contains the State of the Player before /login
@@ -15,6 +15,7 @@ import fr.xephi.authme.settings.properties.RestrictionSettings;
import org.bukkit.entity.Player;
import javax.inject.Inject;
import java.util.Locale;
/**
* Async task when a player wants to log out.
@@ -51,7 +52,7 @@ public class AsynchronousLogout implements AsynchronousProcess {
* @param player the player wanting to log out
*/
public void logout(Player player) {
String name = player.getName().toLowerCase();
String name = player.getName().toLowerCase(Locale.ROOT);
if (!playerCache.isAuthenticated(name)) {
service.send(player, MessageKey.NOT_LOGGED_IN);
return;
@@ -18,6 +18,7 @@ import org.bukkit.Location;
import org.bukkit.entity.Player;
import javax.inject.Inject;
import java.util.Locale;
/**
* Async process called when a player quits the server.
@@ -63,7 +64,7 @@ public class AsynchronousQuit implements AsynchronousProcess {
if (player == null || validationService.isUnrestricted(player.getName())) {
return;
}
String name = player.getName().toLowerCase();
String name = player.getName().toLowerCase(Locale.ROOT);
boolean wasLoggedIn = playerCache.isAuthenticated(name);
if (wasLoggedIn) {
@@ -20,6 +20,7 @@ import org.bukkit.entity.Player;
import javax.inject.Inject;
import java.util.List;
import java.util.Locale;
import static fr.xephi.authme.permission.PlayerStatePermission.ALLOW_MULTIPLE_ACCOUNTS;
@@ -67,7 +68,7 @@ public class AsyncRegister implements AsynchronousProcess {
* @return true if the checks are successful and the event hasn't marked the action as denied, false otherwise.
*/
private boolean preRegisterCheck(RegistrationMethod<?> variant, Player player) {
String name = player.getName().toLowerCase();
String name = player.getName().toLowerCase(Locale.ROOT);
if (playerCache.isAuthenticated(name)) {
service.send(player, MessageKey.ALREADY_LOGGED_IN_ERROR);
return false;
@@ -5,6 +5,8 @@ import fr.xephi.authme.security.crypts.HashedPassword;
import fr.xephi.authme.util.PlayerUtils;
import org.bukkit.entity.Player;
import java.util.Locale;
/**
* Helper for constructing PlayerAuth objects.
*/
@@ -23,7 +25,7 @@ final class PlayerAuthBuilderHelper {
*/
static PlayerAuth createPlayerAuth(Player player, HashedPassword hashedPassword, String email) {
return PlayerAuth.builder()
.name(player.getName().toLowerCase())
.name(player.getName().toLowerCase(Locale.ROOT))
.realName(player.getName())
.password(hashedPassword)
.email(email)