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
@@ -28,6 +28,7 @@ import java.time.Instant;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.Locale;
import java.util.Optional;
import java.util.stream.Collectors;
@@ -457,7 +458,7 @@ public class AuthMeApiTest {
String name = "Marco";
String password = "myP4ss";
HashedPassword hashedPassword = new HashedPassword("0395872SLKDFJOWEIUTEJSD");
given(passwordSecurity.computeHash(password, name.toLowerCase())).willReturn(hashedPassword);
given(passwordSecurity.computeHash(password, name.toLowerCase(Locale.ROOT))).willReturn(hashedPassword);
given(dataSource.saveAuth(any(PlayerAuth.class))).willReturn(true);
// when
@@ -465,10 +466,10 @@ public class AuthMeApiTest {
// then
assertThat(result, equalTo(true));
verify(passwordSecurity).computeHash(password, name.toLowerCase());
verify(passwordSecurity).computeHash(password, name.toLowerCase(Locale.ROOT));
ArgumentCaptor<PlayerAuth> authCaptor = ArgumentCaptor.forClass(PlayerAuth.class);
verify(dataSource).saveAuth(authCaptor.capture());
assertThat(authCaptor.getValue().getNickname(), equalTo(name.toLowerCase()));
assertThat(authCaptor.getValue().getNickname(), equalTo(name.toLowerCase(Locale.ROOT)));
assertThat(authCaptor.getValue().getRealName(), equalTo(name));
assertThat(authCaptor.getValue().getPassword(), equalTo(hashedPassword));
}
@@ -9,6 +9,7 @@ import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Set;
import java.util.function.BiConsumer;
@@ -90,7 +91,7 @@ public class CommandInitializerTest {
@Override
public void accept(CommandDescription command, Integer depth) {
for (String label : command.getLabels()) {
if (!label.equals(label.toLowerCase())) {
if (!label.equals(label.toLowerCase(Locale.ROOT))) {
fail("Label '" + label + "' should be lowercase");
} else if (invalidPattern.matcher(label).matches()) {
fail("Label '" + label + "' has whitespace");
@@ -17,6 +17,7 @@ import org.mockito.junit.MockitoJUnitRunner;
import java.util.Collections;
import java.util.HashSet;
import java.util.Locale;
import java.util.Map;
import java.util.Set;
@@ -129,7 +130,7 @@ public class ConverterCommandTest {
setBukkitServiceToRunTaskAsynchronously(bukkitService);
// when
command.executeCommand(sender, Collections.singletonList(converterName.toUpperCase()));
command.executeCommand(sender, Collections.singletonList(converterName.toUpperCase(Locale.ROOT)));
// then
verify(converter).execute(sender);
@@ -12,6 +12,7 @@ import org.mockito.junit.MockitoJUnitRunner;
import java.util.Collections;
import java.util.HashSet;
import java.util.Locale;
import java.util.Set;
import static com.google.common.collect.Sets.newHashSet;
@@ -67,7 +68,7 @@ public class PurgeBannedPlayersCommandTest {
private static Set<String> asLowerCaseSet(String... items) {
Set<String> result = new HashSet<>(items.length);
for (String item : items) {
result.add(item.toLowerCase());
result.add(item.toLowerCase(Locale.ROOT));
}
return result;
}
@@ -11,6 +11,8 @@ import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;
import java.util.Locale;
import static fr.xephi.authme.service.BukkitServiceTestHelper.setBukkitServiceToRunTaskAsynchronously;
import static fr.xephi.authme.service.BukkitServiceTestHelper.setBukkitServiceToRunTaskOptionallyAsync;
import static java.util.Arrays.asList;
@@ -71,7 +73,7 @@ public class PurgePlayerCommandTest {
// then
verify(dataSource).isAuthAvailable(name);
verify(purgeExecutor).executePurge(singletonList(player), singletonList(name.toLowerCase()));
verify(purgeExecutor).executePurge(singletonList(player), singletonList(name.toLowerCase(Locale.ROOT)));
}
@Test
@@ -87,6 +89,6 @@ public class PurgePlayerCommandTest {
command.executeCommand(sender, asList(name, "force"));
// then
verify(purgeExecutor).executePurge(singletonList(player), singletonList(name.toLowerCase()));
verify(purgeExecutor).executePurge(singletonList(player), singletonList(name.toLowerCase(Locale.ROOT)));
}
}
@@ -21,6 +21,7 @@ import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;
import java.util.Arrays;
import java.util.Locale;
import static fr.xephi.authme.service.BukkitServiceTestHelper.setBukkitServiceToRunTaskOptionallyAsync;
import static fr.xephi.authme.service.BukkitServiceTestHelper.setBukkitServiceToScheduleSyncTaskFromOptionallyAsyncTask;
@@ -179,7 +180,7 @@ public class RegisterAdminCommandTest {
private void assertAuthHasInfo(PlayerAuth auth, String name, HashedPassword hashedPassword) {
assertThat(auth.getRealName(), equalTo(name));
assertThat(auth.getNickname(), equalTo(name.toLowerCase()));
assertThat(auth.getNickname(), equalTo(name.toLowerCase(Locale.ROOT)));
assertThat(auth.getPassword(), equalTo(hashedPassword));
}
}
@@ -16,6 +16,7 @@ import org.mockito.junit.MockitoJUnitRunner;
import java.util.Arrays;
import java.util.List;
import java.util.Locale;
import static com.google.common.base.Preconditions.checkArgument;
import static java.util.Collections.emptyList;
@@ -125,7 +126,7 @@ public class DebugCommandTest {
CommandSender sender = mock(CommandSender.class);
given(permissionsManager.hasPermission(sender, section.getRequiredPermission())).willReturn(true);
List<String> arguments = Arrays.asList(section.getName().toUpperCase(), "test", "toast");
List<String> arguments = Arrays.asList(section.getName().toUpperCase(Locale.ROOT), "test", "toast");
// when
command.executeCommand(sender, arguments);
@@ -144,7 +145,7 @@ public class DebugCommandTest {
CommandSender sender = mock(CommandSender.class);
given(permissionsManager.hasPermission(sender, section.getRequiredPermission())).willReturn(false);
List<String> arguments = Arrays.asList(section.getName().toUpperCase(), "test");
List<String> arguments = Arrays.asList(section.getName().toUpperCase(Locale.ROOT), "test");
// when
command.executeCommand(sender, arguments);
@@ -22,6 +22,7 @@ import org.junit.runner.RunWith;
import org.mockito.Mock;
import java.util.Collections;
import java.util.Locale;
import static fr.xephi.authme.service.BukkitServiceTestHelper.setBukkitServiceToRunTaskAsynchronously;
import static org.hamcrest.Matchers.equalTo;
@@ -187,7 +188,7 @@ public class RecoverEmailCommandTest {
setBukkitServiceToRunTaskAsynchronously(bukkitService);
// when
command.executeCommand(sender, Collections.singletonList(email.toUpperCase()));
command.executeCommand(sender, Collections.singletonList(email.toUpperCase(Locale.ROOT)));
// then
verify(emailService).hasAllInformation();
@@ -23,6 +23,7 @@ import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Locale;
import java.util.stream.Collectors;
import static fr.xephi.authme.command.TestCommandsUtil.getCommandWithLabel;
@@ -446,19 +447,19 @@ public class HelpProviderTest {
given(helpMessagesService.buildLocalizedDescription(any(CommandDescription.class)))
.willAnswer(new ReturnsArgumentAt(0));
for (HelpMessage key : HelpMessage.values()) {
String text = key.name().replace("_", " ").toLowerCase();
String text = key.name().replace("_", " ").toLowerCase(Locale.ROOT);
given(helpMessagesService.getMessage(key))
.willReturn(text.substring(0, 1).toUpperCase() + text.substring(1));
.willReturn(text.substring(0, 1).toUpperCase(Locale.ROOT) + text.substring(1));
}
for (DefaultPermission permission : DefaultPermission.values()) {
String text = permission.name().replace("_", " ").toLowerCase();
String text = permission.name().replace("_", " ").toLowerCase(Locale.ROOT);
given(helpMessagesService.getMessage(permission))
.willReturn(text.substring(0, 1).toUpperCase() + text.substring(1));
.willReturn(text.substring(0, 1).toUpperCase(Locale.ROOT) + text.substring(1));
}
for (HelpSection section : HelpSection.values()) {
String text = section.name().replace("_", " ").toLowerCase();
String text = section.name().replace("_", " ").toLowerCase(Locale.ROOT);
given(helpMessagesService.getMessage(section))
.willReturn(text.substring(0, 1).toUpperCase() + text.substring(1));
.willReturn(text.substring(0, 1).toUpperCase(Locale.ROOT) + text.substring(1));
}
}
@@ -7,6 +7,8 @@ import fr.xephi.authme.util.expiring.TimedCounter;
import org.bukkit.entity.Player;
import org.junit.Test;
import java.util.Locale;
import static fr.xephi.authme.AuthMeMatchers.stringWithLength;
import static org.hamcrest.Matchers.equalTo;
import static org.hamcrest.Matchers.not;
@@ -34,7 +36,7 @@ public class LoginCaptchaManagerTest {
// then
assertThat(manager.isCaptchaRequired(player), equalTo(false));
manager.increaseLoginFailureCount(player);
assertThat(manager.isCaptchaRequired(player.toUpperCase()), equalTo(true));
assertThat(manager.isCaptchaRequired(player.toUpperCase(Locale.ROOT)), equalTo(true));
assertThat(manager.isCaptchaRequired("otherPlayer"), equalTo(false));
}
@@ -167,6 +169,6 @@ public class LoginCaptchaManagerTest {
private static void assertHasCount(LoginCaptchaManager manager, String player, Integer count) {
TimedCounter<String> playerCounts = ReflectionTestUtils
.getFieldValue(LoginCaptchaManager.class, manager, "playerCounts");
assertThat(playerCounts.get(player.toLowerCase()), equalTo(count));
assertThat(playerCounts.get(player.toLowerCase(Locale.ROOT)), equalTo(count));
}
}
@@ -27,6 +27,7 @@ import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;
import java.util.Collections;
import java.util.Locale;
import java.util.Set;
import static com.google.common.collect.Sets.newHashSet;
@@ -118,7 +119,7 @@ public class PasswordSecurityTest {
HashedPassword password = new HashedPassword("$TEST$10$SOME_HASH", null);
String playerName = "Tester";
// Calls to EncryptionMethod are always with the lower-case version of the name
String playerLowerCase = playerName.toLowerCase();
String playerLowerCase = playerName.toLowerCase(Locale.ROOT);
String clearTextPass = "myPassTest";
given(dataSource.getPassword(playerName)).willReturn(password);
@@ -139,7 +140,7 @@ public class PasswordSecurityTest {
// given
HashedPassword password = new HashedPassword("$TEST$10$SOME_HASH", null);
String playerName = "My_PLayer";
String playerLowerCase = playerName.toLowerCase();
String playerLowerCase = playerName.toLowerCase(Locale.ROOT);
String clearTextPass = "passw0Rd1";
given(dataSource.getPassword(playerName)).willReturn(password);
@@ -178,7 +179,7 @@ public class PasswordSecurityTest {
HashedPassword password =
new HashedPassword("$2y$10$2e6d2193f43501c926e25elvWlPmWczmrfrnbZV0dUZGITjYjnkkW");
String playerName = "somePlayer";
String playerLowerCase = playerName.toLowerCase();
String playerLowerCase = playerName.toLowerCase(Locale.ROOT);
String clearTextPass = "Test";
// MD5 hash for "Test"
HashedPassword newPassword = new HashedPassword("0cbc6611f5540bd0809a388dc95a615b");
@@ -230,7 +231,7 @@ public class PasswordSecurityTest {
// given
String password = "MyP@ssword";
String username = "theUserInTest";
String usernameLowerCase = username.toLowerCase();
String usernameLowerCase = username.toLowerCase(Locale.ROOT);
HashedPassword hashedPassword = new HashedPassword("$T$est#Hash", "__someSalt__");
given(method.computeHash(password, usernameLowerCase)).willReturn(hashedPassword);
given(settings.getProperty(SecuritySettings.PASSWORD_HASH)).willReturn(HashAlgorithm.JOOMLA);
@@ -8,6 +8,7 @@ import org.junit.BeforeClass;
import org.junit.Test;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import static org.hamcrest.Matchers.equalTo;
@@ -154,13 +155,13 @@ public abstract class AbstractEncryptionMethodTest {
method.comparePassword(password, hashedPassword, USERNAME));
assumeThat(SKIP_LONG_TESTS, equalTo(false));
if (!password.equals(password.toLowerCase())) {
if (!password.equals(password.toLowerCase(Locale.ROOT))) {
assertFalse("Lower-case of '" + password + "' should not match generated hash '" + hash + "'",
method.comparePassword(password.toLowerCase(), hashedPassword, USERNAME));
method.comparePassword(password.toLowerCase(Locale.ROOT), hashedPassword, USERNAME));
}
if (!password.equals(password.toUpperCase())) {
if (!password.equals(password.toUpperCase(Locale.ROOT))) {
assertFalse("Upper-case of '" + password + "' should not match generated hash '" + hash + "'",
method.comparePassword(password.toUpperCase(), hashedPassword, USERNAME));
method.comparePassword(password.toUpperCase(Locale.ROOT), hashedPassword, USERNAME));
}
}
}
@@ -15,6 +15,7 @@ import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;
import java.util.Arrays;
import java.util.Locale;
import static fr.xephi.authme.AuthMeMatchers.equalToHash;
import static org.hamcrest.Matchers.equalToIgnoringCase;
@@ -118,7 +119,7 @@ public class MigrationServiceTest {
private static void setSha256MockToUppercase(Sha256 sha256) {
given(sha256.computeHash(anyString(), anyString())).willAnswer(invocation -> {
String plainPassword = invocation.getArgument(0);
return new HashedPassword(plainPassword.toUpperCase(), null);
return new HashedPassword(plainPassword.toUpperCase(Locale.ROOT), null);
});
}
}