diff --git a/src/main/java/fr/xephi/authme/datasource/CacheDataSource.java b/src/main/java/fr/xephi/authme/datasource/CacheDataSource.java index 4d0d4436..2ef221f8 100644 --- a/src/main/java/fr/xephi/authme/datasource/CacheDataSource.java +++ b/src/main/java/fr/xephi/authme/datasource/CacheDataSource.java @@ -160,8 +160,8 @@ public class CacheDataSource implements DataSource { } @Override - public synchronized List getAllAuthsByEmail(final String email) { - return source.getAllAuthsByEmail(email); + public synchronized int countAuthsByEmail(final String email) { + return source.countAuthsByEmail(email); } @Override diff --git a/src/main/java/fr/xephi/authme/datasource/DataSource.java b/src/main/java/fr/xephi/authme/datasource/DataSource.java index 4009586c..becccb6a 100644 --- a/src/main/java/fr/xephi/authme/datasource/DataSource.java +++ b/src/main/java/fr/xephi/authme/datasource/DataSource.java @@ -101,12 +101,12 @@ public interface DataSource { List getAllAuthsByIp(String ip); /** - * Return all usernames associated with the given email address. + * Return the number of accounts associated with the given email address. * * @param email The email address to look up - * @return Users using the given email address + * @return Number of accounts using the given email address */ - List getAllAuthsByEmail(String email); + int countAuthsByEmail(String email); /** * Update the email of the PlayerAuth in the data source. diff --git a/src/main/java/fr/xephi/authme/datasource/FlatFile.java b/src/main/java/fr/xephi/authme/datasource/FlatFile.java index 9bab76e1..7c4a92d4 100644 --- a/src/main/java/fr/xephi/authme/datasource/FlatFile.java +++ b/src/main/java/fr/xephi/authme/datasource/FlatFile.java @@ -487,25 +487,21 @@ public class FlatFile implements DataSource { } @Override - public List getAllAuthsByEmail(String email) { + public int countAuthsByEmail(String email) { BufferedReader br = null; - List countEmail = new ArrayList<>(); + int countEmail = 0; try { br = new BufferedReader(new FileReader(source)); String line; while ((line = br.readLine()) != null) { String[] args = line.split(":"); if (args.length > 8 && args[8].equals(email)) { - countEmail.add(args[0]); + ++countEmail; } } return countEmail; - } catch (FileNotFoundException ex) { - ConsoleLogger.showError(ex.getMessage()); - return new ArrayList<>(); } catch (IOException ex) { ConsoleLogger.showError(ex.getMessage()); - return new ArrayList<>(); } finally { if (br != null) { try { @@ -514,6 +510,7 @@ public class FlatFile implements DataSource { } } } + return 0; } @Override diff --git a/src/main/java/fr/xephi/authme/datasource/MySQL.java b/src/main/java/fr/xephi/authme/datasource/MySQL.java index fba6d0a6..a2f43c7e 100644 --- a/src/main/java/fr/xephi/authme/datasource/MySQL.java +++ b/src/main/java/fr/xephi/authme/datasource/MySQL.java @@ -706,20 +706,19 @@ public class MySQL implements DataSource { } @Override - public synchronized List getAllAuthsByEmail(String email) { - List emails = new ArrayList<>(); - String sql = "SELECT " + col.NAME + " FROM " + tableName + " WHERE " + col.EMAIL + "=?;"; + public synchronized int countAuthsByEmail(String email) { + String sql = "SELECT COUNT(1) FROM " + tableName + " WHERE UPPER(" + col.EMAIL + ") = UPPER(?)"; try (Connection con = getConnection(); PreparedStatement pst = con.prepareStatement(sql)) { pst.setString(1, email); try (ResultSet rs = pst.executeQuery()) { - while (rs.next()) { - emails.add(rs.getString(col.NAME)); + if (rs.next()) { + return rs.getInt(1); } } } catch (SQLException ex) { logSqlException(ex); } - return emails; + return 0; } @Override @@ -907,12 +906,12 @@ public class MySQL implements DataSource { @Override public synchronized boolean isEmailStored(String email) { - String sql = "SELECT 1 FROM " + tableName + " WHERE " + col.EMAIL + " = ?"; - try (Connection con = ds.getConnection()) { - PreparedStatement pst = con.prepareStatement(sql); + String sql = "SELECT 1 FROM " + tableName + " WHERE UPPER(" + col.EMAIL + ") = UPPER(?)"; + try (Connection con = ds.getConnection(); PreparedStatement pst = con.prepareStatement(sql)) { pst.setString(1, email); - ResultSet rs = pst.executeQuery(); - return rs.next(); + try (ResultSet rs = pst.executeQuery()) { + return rs.next(); + } } catch (SQLException e) { logSqlException(e); } diff --git a/src/main/java/fr/xephi/authme/datasource/SQLite.java b/src/main/java/fr/xephi/authme/datasource/SQLite.java index f27d8ef0..787b6b0c 100644 --- a/src/main/java/fr/xephi/authme/datasource/SQLite.java +++ b/src/main/java/fr/xephi/authme/datasource/SQLite.java @@ -410,25 +410,19 @@ public class SQLite implements DataSource { } @Override - public List getAllAuthsByEmail(String email) { - PreparedStatement pst = null; - ResultSet rs = null; - List countEmail = new ArrayList<>(); - try { - pst = con.prepareStatement("SELECT * FROM " + tableName + " WHERE " + col.EMAIL + "=?;"); + public int countAuthsByEmail(String email) { + String sql = "SELECT COUNT(1) FROM " + tableName + " WHERE " + col.EMAIL + " = ? COLLATE NOCASE;"; + try (PreparedStatement pst = con.prepareStatement(sql)) { pst.setString(1, email); - rs = pst.executeQuery(); - while (rs.next()) { - countEmail.add(rs.getString(col.NAME)); + try (ResultSet rs = pst.executeQuery()) { + if (rs.next()) { + return rs.getInt(1); + } } - return countEmail; } catch (SQLException ex) { logSqlException(ex); - } finally { - close(rs); - close(pst); } - return new ArrayList<>(); + return 0; } @Override diff --git a/src/main/java/fr/xephi/authme/process/register/AsyncRegister.java b/src/main/java/fr/xephi/authme/process/register/AsyncRegister.java index ac921510..e17c511d 100644 --- a/src/main/java/fr/xephi/authme/process/register/AsyncRegister.java +++ b/src/main/java/fr/xephi/authme/process/register/AsyncRegister.java @@ -98,7 +98,7 @@ public class AsyncRegister { private void emailRegister() { if (Settings.getmaxRegPerEmail > 0 && !plugin.getPermissionsManager().hasPermission(player, PlayerStatePermission.ALLOW_MULTIPLE_ACCOUNTS) - && database.getAllAuthsByEmail(email).size() >= Settings.getmaxRegPerEmail) { + && database.countAuthsByEmail(email) >= Settings.getmaxRegPerEmail) { m.send(player, MessageKey.MAX_REGISTER_EXCEEDED); return; } diff --git a/src/test/java/fr/xephi/authme/datasource/SQLiteIntegrationTest.java b/src/test/java/fr/xephi/authme/datasource/SQLiteIntegrationTest.java index 8de77e04..bf211b2e 100644 --- a/src/test/java/fr/xephi/authme/datasource/SQLiteIntegrationTest.java +++ b/src/test/java/fr/xephi/authme/datasource/SQLiteIntegrationTest.java @@ -138,6 +138,39 @@ public class SQLiteIntegrationTest { assertThat(userAuth.getPassword(), equalToHash("b28c32f624a4eb161d6adc9acb5bfc5b", "f750ba32")); } + @Test + public void shouldFindIfEmailExists() { + // given + DataSource dataSource = new SQLite(settings, con, false); + + // when + boolean isUserMailPresent = dataSource.isEmailStored("user@example.org"); + boolean isUserMailPresentCaseInsensitive = dataSource.isEmailStored("user@example.ORG"); + boolean isInvalidMailPresent = dataSource.isEmailStored("not-in-database@example.com"); + + // then + assertThat(isUserMailPresent, equalTo(true)); + assertThat(isUserMailPresentCaseInsensitive, equalTo(true)); + assertThat(isInvalidMailPresent, equalTo(false)); + } + + @Test + public void shouldCountAuthsByEmail() { + // given + DataSource dataSource = new SQLite(settings, con, false); + + // when + int userMailCount = dataSource.countAuthsByEmail("user@example.ORG"); + int invalidMailCount = dataSource.countAuthsByEmail("not.in.db@example.com"); + dataSource.saveAuth(PlayerAuth.builder().name("Test").email("user@EXAMPLE.org").build()); + int newUserCount = dataSource.countAuthsByEmail("user@Example.org"); + + // then + assertThat(userMailCount, equalTo(1)); + assertThat(invalidMailCount, equalTo(0)); + assertThat(newUserCount, equalTo(2)); + } + private static void set(Property property, T value) { when(settings.getProperty(property)).thenReturn(value); }