diff --git a/src/main/java/fr/xephi/authme/api/NewAPI.java b/src/main/java/fr/xephi/authme/api/NewAPI.java index c77affa9..4ed3fd2e 100644 --- a/src/main/java/fr/xephi/authme/api/NewAPI.java +++ b/src/main/java/fr/xephi/authme/api/NewAPI.java @@ -221,6 +221,15 @@ public class NewAPI { management.performUnregisterByAdmin(null, player.getName(), player); } + /** + * Unregister a player from AuthMe by name. + * + * @param name the name of the player (case-insensitive) + */ + public void forceUnregister(String name) { + management.performUnregisterByAdmin(null, name, Bukkit.getPlayer(name)); + } + /** * Get all the registered names (lowercase) * diff --git a/src/main/java/fr/xephi/authme/datasource/MySQL.java b/src/main/java/fr/xephi/authme/datasource/MySQL.java index dc08d7b4..da0ad602 100644 --- a/src/main/java/fr/xephi/authme/datasource/MySQL.java +++ b/src/main/java/fr/xephi/authme/datasource/MySQL.java @@ -612,7 +612,7 @@ public class MySQL implements DataSource { } } } - pst.setString(1, user); + pst.setString(1, user.toLowerCase()); pst.executeUpdate(); return true; } catch (SQLException ex) { diff --git a/src/main/java/fr/xephi/authme/datasource/SQLite.java b/src/main/java/fr/xephi/authme/datasource/SQLite.java index 8aae94c5..d9c847f4 100644 --- a/src/main/java/fr/xephi/authme/datasource/SQLite.java +++ b/src/main/java/fr/xephi/authme/datasource/SQLite.java @@ -335,7 +335,7 @@ public class SQLite implements DataSource { PreparedStatement pst = null; try { pst = con.prepareStatement("DELETE FROM " + tableName + " WHERE " + col.NAME + "=?;"); - pst.setString(1, user); + pst.setString(1, user.toLowerCase()); pst.executeUpdate(); return true; } catch (SQLException ex) { diff --git a/src/test/java/fr/xephi/authme/api/NewAPITest.java b/src/test/java/fr/xephi/authme/api/NewAPITest.java index 35cc7d30..5ec009c0 100644 --- a/src/test/java/fr/xephi/authme/api/NewAPITest.java +++ b/src/test/java/fr/xephi/authme/api/NewAPITest.java @@ -212,6 +212,36 @@ public class NewAPITest { assertThat(result, contains(names)); } + @Test + public void shouldUnregisterPlayer() { + // given + Player player = mock(Player.class); + String name = "Donald"; + given(player.getName()).willReturn(name); + + // when + api.forceUnregister(player); + + // then + verify(management).performUnregisterByAdmin(null, name, player); + } + + @Test + public void shouldUnregisterPlayerByName() { + // given + Server server = mock(Server.class); + ReflectionTestUtils.setField(Bukkit.class, null, "server", server); + String name = "tristan"; + Player player = mock(Player.class); + given(server.getPlayer(name)).willReturn(player); + + // when + api.forceUnregister(name); + + // then + verify(management).performUnregisterByAdmin(null, name, player); + } + private static Player mockPlayerWithName(String name) { Player player = mock(Player.class); given(player.getName()).willReturn(name); diff --git a/src/test/java/fr/xephi/authme/datasource/AbstractDataSourceIntegrationTest.java b/src/test/java/fr/xephi/authme/datasource/AbstractDataSourceIntegrationTest.java index 1223130c..424a2320 100644 --- a/src/test/java/fr/xephi/authme/datasource/AbstractDataSourceIntegrationTest.java +++ b/src/test/java/fr/xephi/authme/datasource/AbstractDataSourceIntegrationTest.java @@ -195,7 +195,7 @@ public abstract class AbstractDataSourceIntegrationTest { DataSource dataSource = getDataSource(); // when - boolean response1 = dataSource.removeAuth("bobby"); + boolean response1 = dataSource.removeAuth("Bobby"); boolean response2 = dataSource.removeAuth("does-not-exist"); // then