- Old SQLite setups have the last IP column as NOT NULL but without a default value. With the new concept (where we don't set a last IP on player registration) it fails. - Create an /authme debug child that allows to migrate SQLite (tricky because SQLite does not support dropping or modifying columns) - Allow last IP column to be NOT NULL in MySQL as well (extend MySQL /authme debug child) - Add TODO comments with follow-up issue to extend our commands with new registration IP field
This commit is contained in:
@@ -64,7 +64,7 @@ public class FlatFileIntegrationTest {
|
||||
assertThat(getName("bobby", authList), hasAuthBasicData("bobby", "bobby", null, "123.45.67.89"));
|
||||
assertThat(getName("bobby", authList), hasAuthLocation(1.05, 2.1, 4.2, "world", 0, 0));
|
||||
assertThat(getName("bobby", authList).getPassword(), equalToHash("$SHA$11aa0706173d7272$dbba966"));
|
||||
assertThat(getName("twofields", authList), hasAuthBasicData("twofields", "twofields", null, "127.0.0.1"));
|
||||
assertThat(getName("twofields", authList), hasAuthBasicData("twofields", "twofields", null, null));
|
||||
assertThat(getName("twofields", authList).getPassword(), equalToHash("hash1234"));
|
||||
assertThat(getName("threefields", authList), hasAuthBasicData("threefields", "threefields", null, "33.33.33.33"));
|
||||
assertThat(getName("fourfields", authList), hasAuthBasicData("fourfields", "fourfields", null, "4.4.4.4"));
|
||||
|
||||
@@ -76,7 +76,7 @@ public class MySqlIntegrationTest extends AbstractDataSourceIntegrationTest {
|
||||
@Override
|
||||
protected DataSource getDataSource(String saltColumn) {
|
||||
when(settings.getProperty(DatabaseSettings.MYSQL_COL_SALT)).thenReturn(saltColumn);
|
||||
return MySqlTestUtil.createMySql(settings, hikariSource);
|
||||
return SqlDataSourceTestUtil.createMySql(settings, hikariSource);
|
||||
}
|
||||
|
||||
private static <T> void set(Property<T> property, T value) {
|
||||
|
||||
@@ -1,30 +0,0 @@
|
||||
package fr.xephi.authme.datasource;
|
||||
|
||||
import com.zaxxer.hikari.HikariDataSource;
|
||||
import fr.xephi.authme.datasource.mysqlextensions.MySqlExtension;
|
||||
import fr.xephi.authme.datasource.mysqlextensions.MySqlExtensionsFactory;
|
||||
import fr.xephi.authme.settings.Settings;
|
||||
|
||||
import static org.mockito.ArgumentMatchers.any;
|
||||
import static org.mockito.BDDMockito.given;
|
||||
import static org.mockito.Mockito.mock;
|
||||
|
||||
/**
|
||||
* Test util for the MySQL data source.
|
||||
*/
|
||||
public final class MySqlTestUtil {
|
||||
|
||||
private MySqlTestUtil() {
|
||||
}
|
||||
|
||||
public static MySQL createMySql(Settings settings, HikariDataSource hikariDataSource) {
|
||||
MySqlExtensionsFactory extensionsFactory = mock(MySqlExtensionsFactory.class);
|
||||
given(extensionsFactory.buildExtension(any())).willReturn(mock(MySqlExtension.class));
|
||||
return createMySql(settings, hikariDataSource, extensionsFactory);
|
||||
}
|
||||
|
||||
public static MySQL createMySql(Settings settings, HikariDataSource hikariDataSource,
|
||||
MySqlExtensionsFactory extensionsFactory) {
|
||||
return new MySQL(settings, hikariDataSource, extensionsFactory);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,52 @@
|
||||
package fr.xephi.authme.datasource;
|
||||
|
||||
import com.zaxxer.hikari.HikariDataSource;
|
||||
import fr.xephi.authme.datasource.mysqlextensions.MySqlExtension;
|
||||
import fr.xephi.authme.datasource.mysqlextensions.MySqlExtensionsFactory;
|
||||
import fr.xephi.authme.settings.Settings;
|
||||
|
||||
import java.sql.Connection;
|
||||
import java.sql.SQLException;
|
||||
|
||||
import static org.mockito.ArgumentMatchers.any;
|
||||
import static org.mockito.BDDMockito.given;
|
||||
import static org.mockito.Mockito.mock;
|
||||
|
||||
/**
|
||||
* Test util for the SQL data sources.
|
||||
*/
|
||||
public final class SqlDataSourceTestUtil {
|
||||
|
||||
private SqlDataSourceTestUtil() {
|
||||
}
|
||||
|
||||
public static MySQL createMySql(Settings settings, HikariDataSource hikariDataSource) {
|
||||
MySqlExtensionsFactory extensionsFactory = mock(MySqlExtensionsFactory.class);
|
||||
given(extensionsFactory.buildExtension(any())).willReturn(mock(MySqlExtension.class));
|
||||
return new MySQL(settings, hikariDataSource, extensionsFactory);
|
||||
}
|
||||
|
||||
public static SQLite createSqlite(Settings settings, Connection connection) {
|
||||
return new SQLite(settings, connection) {
|
||||
// Override reload() so it doesn't run SQLite#connect, since we're given a specific Connection to use
|
||||
@Override
|
||||
public void reload() {
|
||||
try {
|
||||
this.setup();
|
||||
} catch (SQLException e) {
|
||||
throw new IllegalStateException(e);
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
public static SQLite createSqliteAndInitialize(Settings settings, Connection connection) {
|
||||
SQLite sqLite = createSqlite(settings, connection);
|
||||
try {
|
||||
sqLite.setup();
|
||||
} catch (SQLException e) {
|
||||
throw new IllegalStateException(e);
|
||||
}
|
||||
return sqLite;
|
||||
}
|
||||
}
|
||||
@@ -4,10 +4,17 @@ import fr.xephi.authme.TestHelper;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
|
||||
import java.sql.DatabaseMetaData;
|
||||
import java.sql.ResultSet;
|
||||
import java.sql.SQLException;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
import static org.hamcrest.Matchers.containsString;
|
||||
import static org.hamcrest.Matchers.equalTo;
|
||||
import static org.hamcrest.Matchers.nullValue;
|
||||
import static org.junit.Assert.assertThat;
|
||||
import static org.mockito.BDDMockito.given;
|
||||
import static org.mockito.Mockito.mock;
|
||||
import static org.mockito.Mockito.verify;
|
||||
import static org.mockito.hamcrest.MockitoHamcrest.argThat;
|
||||
|
||||
@@ -40,4 +47,108 @@ public class SqlDataSourceUtilsTest {
|
||||
// then
|
||||
verify(logger).warning(argThat(containsString(msg)));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void shouldFetchNullableStatus() throws SQLException {
|
||||
// given
|
||||
String tableName = "data";
|
||||
String columnName = "category";
|
||||
ResultSet resultSet = mock(ResultSet.class);
|
||||
given(resultSet.getInt("NULLABLE")).willReturn(DatabaseMetaData.columnNullable);
|
||||
given(resultSet.next()).willReturn(true);
|
||||
DatabaseMetaData metaData = mock(DatabaseMetaData.class);
|
||||
given(metaData.getColumns(null, null, tableName, columnName)).willReturn(resultSet);
|
||||
|
||||
// when
|
||||
boolean result = SqlDataSourceUtils.isNotNullColumn(metaData, tableName, columnName);
|
||||
|
||||
// then
|
||||
assertThat(result, equalTo(false));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void shouldReturnFalseForUnknownNullableStatus() throws SQLException {
|
||||
// given
|
||||
String tableName = "comments";
|
||||
String columnName = "author";
|
||||
ResultSet resultSet = mock(ResultSet.class);
|
||||
given(resultSet.getInt("NULLABLE")).willReturn(DatabaseMetaData.columnNullableUnknown);
|
||||
given(resultSet.next()).willReturn(true);
|
||||
DatabaseMetaData metaData = mock(DatabaseMetaData.class);
|
||||
given(metaData.getColumns(null, null, tableName, columnName)).willReturn(resultSet);
|
||||
|
||||
// when
|
||||
boolean result = SqlDataSourceUtils.isNotNullColumn(metaData, tableName, columnName);
|
||||
|
||||
// then
|
||||
assertThat(result, equalTo(false));
|
||||
}
|
||||
|
||||
@Test(expected = IllegalStateException.class)
|
||||
public void shouldThrowForUnknownColumnInNullableCheck() throws SQLException {
|
||||
// given
|
||||
String tableName = "data";
|
||||
String columnName = "unknown";
|
||||
ResultSet resultSet = mock(ResultSet.class);
|
||||
given(resultSet.next()).willReturn(false);
|
||||
DatabaseMetaData metaData = mock(DatabaseMetaData.class);
|
||||
given(metaData.getColumns(null, null, tableName, columnName)).willReturn(resultSet);
|
||||
|
||||
// when
|
||||
SqlDataSourceUtils.isNotNullColumn(metaData, tableName, columnName);
|
||||
|
||||
// then - expect exception
|
||||
}
|
||||
|
||||
@Test
|
||||
public void shouldGetDefaultValue() throws SQLException {
|
||||
// given
|
||||
String tableName = "data";
|
||||
String columnName = "category";
|
||||
ResultSet resultSet = mock(ResultSet.class);
|
||||
given(resultSet.getObject("COLUMN_DEF")).willReturn("Literature");
|
||||
given(resultSet.next()).willReturn(true);
|
||||
DatabaseMetaData metaData = mock(DatabaseMetaData.class);
|
||||
given(metaData.getColumns(null, null, tableName, columnName)).willReturn(resultSet);
|
||||
|
||||
// when
|
||||
Object defaultValue = SqlDataSourceUtils.getColumnDefaultValue(metaData, tableName, columnName);
|
||||
|
||||
// then
|
||||
assertThat(defaultValue, equalTo("Literature"));
|
||||
}
|
||||
|
||||
@Test(expected = IllegalStateException.class)
|
||||
public void shouldThrowForUnknownColumnInDefaultValueRetrieval() throws SQLException {
|
||||
// given
|
||||
String tableName = "data";
|
||||
String columnName = "unknown";
|
||||
ResultSet resultSet = mock(ResultSet.class);
|
||||
given(resultSet.next()).willReturn(false);
|
||||
DatabaseMetaData metaData = mock(DatabaseMetaData.class);
|
||||
given(metaData.getColumns(null, null, tableName, columnName)).willReturn(resultSet);
|
||||
|
||||
// when
|
||||
SqlDataSourceUtils.getColumnDefaultValue(metaData, tableName, columnName);
|
||||
|
||||
// then - expect exception
|
||||
}
|
||||
|
||||
@Test
|
||||
public void shouldHandleNullDefaultValue() throws SQLException {
|
||||
// given
|
||||
String tableName = "data";
|
||||
String columnName = "category";
|
||||
ResultSet resultSet = mock(ResultSet.class);
|
||||
given(resultSet.getObject("COLUMN_DEF")).willReturn(null);
|
||||
given(resultSet.next()).willReturn(true);
|
||||
DatabaseMetaData metaData = mock(DatabaseMetaData.class);
|
||||
given(metaData.getColumns(null, null, tableName, columnName)).willReturn(resultSet);
|
||||
|
||||
// when
|
||||
Object defaultValue = SqlDataSourceUtils.getColumnDefaultValue(metaData, tableName, columnName);
|
||||
|
||||
// then
|
||||
assertThat(defaultValue, nullValue());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -29,6 +29,7 @@ import static fr.xephi.authme.AuthMeMatchers.hasAuthLocation;
|
||||
import static org.hamcrest.Matchers.equalTo;
|
||||
import static org.hamcrest.Matchers.greaterThan;
|
||||
import static org.hamcrest.Matchers.not;
|
||||
import static org.hamcrest.Matchers.nullValue;
|
||||
import static org.junit.Assert.assertThat;
|
||||
import static org.mockito.BDDMockito.given;
|
||||
import static org.mockito.Mockito.mock;
|
||||
@@ -75,7 +76,7 @@ public class LoginSecurityConverterTest {
|
||||
assertThat(captor.getAllValues().get(0).getLastLogin(), equalTo(1494242093652L));
|
||||
assertThat(captor.getAllValues().get(0).getRegistrationDate(), equalTo(1494242093400L));
|
||||
assertThat(captor.getAllValues().get(0).getPassword(), equalToHash("$2a$10$E1Ri7XKeIIBv4qVaiPplgepT7QH9xGFh3hbHfcmCjq7hiW.UBTiGK"));
|
||||
assertThat(captor.getAllValues().get(0).getLastIp(), equalTo("127.0.0.1"));
|
||||
assertThat(captor.getAllValues().get(0).getLastIp(), nullValue());
|
||||
|
||||
assertThat(captor.getAllValues().get(1).getNickname(), equalTo("player2"));
|
||||
assertThat(captor.getAllValues().get(1).getLastLogin(), equalTo(1494242174589L));
|
||||
@@ -84,7 +85,7 @@ public class LoginSecurityConverterTest {
|
||||
assertThat(captor.getAllValues().get(2).getRealName(), equalTo("Player3"));
|
||||
assertThat(captor.getAllValues().get(2).getPassword(), equalToHash("$2a$10$WFui8KSXMLDOVXKFpCLyPukPi4M82w1cv/rNojsAnwJjba3pp8sba"));
|
||||
assertThat(captor.getAllValues().get(2), hasAuthLocation(14.24, 67.99, -12.83, "hubb", -10f, 185f));
|
||||
assertThat(captor.getAllValues().get(2).getLastIp(), equalTo("127.0.0.1"));
|
||||
assertThat(captor.getAllValues().get(2).getLastIp(), nullValue());
|
||||
assertIsCloseTo(captor.getAllValues().get(2).getRegistrationDate(), System.currentTimeMillis(), 500L);
|
||||
}
|
||||
|
||||
@@ -108,7 +109,7 @@ public class LoginSecurityConverterTest {
|
||||
assertThat(captor.getAllValues().get(0).getRealName(), equalTo("Player1"));
|
||||
assertThat(captor.getAllValues().get(0).getLastLogin(), equalTo(1494242093000L));
|
||||
assertThat(captor.getAllValues().get(0).getPassword(), equalToHash("$2a$10$E1Ri7XKeIIBv4qVaiPplgepT7QH9xGFh3hbHfcmCjq7hiW.UBTiGK"));
|
||||
assertThat(captor.getAllValues().get(0).getLastIp(), equalTo("127.0.0.1"));
|
||||
assertThat(captor.getAllValues().get(0).getLastIp(), nullValue());
|
||||
assertIsCloseTo(captor.getAllValues().get(0).getRegistrationDate(), 1494201600000L, 12 * 60 * 60 * 1000);
|
||||
|
||||
assertThat(captor.getAllValues().get(1).getNickname(), equalTo("player2"));
|
||||
|
||||
Reference in New Issue
Block a user