Merge branch 'master' of https://github.com/AuthMe-Team/AuthMeReloaded into jsoncache-fix

Conflicts:
	src/main/java/fr/xephi/authme/listener/protocollib/ProtocolLibService.java
This commit is contained in:
ljacqu 2016-07-02 11:01:46 +02:00
commit 0283395da4
33 changed files with 136 additions and 146 deletions

View File

@ -21,5 +21,5 @@ This can be found by running `/authme version`
### Error Log: ### Error Log:
Pastebin/Hastebin/Gist link of the error logo or stacktrace (if any) Pastebin/Hastebin/Gist link of the error logo or stacktrace (if any)
### COnfiguration: ### Configuration:
Pastebin/Hastebin/Gist link of your config.yml file (remember to delete any sesible data) Pastebin/Hastebin/Gist link of your config.yml file (remember to delete any sensible data)

View File

@ -68,14 +68,16 @@ import org.bukkit.plugin.PluginManager;
import org.bukkit.plugin.java.JavaPlugin; import org.bukkit.plugin.java.JavaPlugin;
import org.bukkit.plugin.messaging.Messenger; import org.bukkit.plugin.messaging.Messenger;
import org.bukkit.scheduler.BukkitScheduler; import org.bukkit.scheduler.BukkitScheduler;
import org.bukkit.scheduler.BukkitTask; import org.bukkit.scheduler.BukkitWorker;
import java.io.File; import java.io.File;
import java.sql.SQLException; import java.sql.SQLException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.Date; import java.util.Date;
import java.util.Iterator;
import java.util.List; import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger; import java.util.logging.Logger;
import static fr.xephi.authme.settings.properties.EmailSettings.MAIL_ACCOUNT; import static fr.xephi.authme.settings.properties.EmailSettings.MAIL_ACCOUNT;
@ -113,10 +115,6 @@ public class AuthMe extends JavaPlugin {
private BukkitService bukkitService; private BukkitService bukkitService;
private AuthMeServiceInitializer initializer; private AuthMeServiceInitializer initializer;
private GeoLiteAPI geoLiteApi; private GeoLiteAPI geoLiteApi;
/*
* Private instances (mail and ProtocolLib)
*/
private SendMailSSL mail; private SendMailSSL mail;
/** /**
@ -281,7 +279,7 @@ public class AuthMe extends JavaPlugin {
// If server is using PermissionsBukkit, print a warning that some features may not be supported // If server is using PermissionsBukkit, print a warning that some features may not be supported
if (PermissionsSystemType.PERMISSIONS_BUKKIT.equals(permsMan.getPermissionSystem())) { if (PermissionsSystemType.PERMISSIONS_BUKKIT.equals(permsMan.getPermissionSystem())) {
ConsoleLogger.info("Warning! This server uses PermissionsBukkit for permissions! Some permissions features may not be supported!"); ConsoleLogger.showError("Warning! This server uses PermissionsBukkit for permissions. Some permissions features may not be supported!");
} }
// Purge on start if enabled // Purge on start if enabled
@ -453,35 +451,50 @@ public class AuthMe extends JavaPlugin {
if (newSettings != null) { if (newSettings != null) {
new PerformBackup(this, newSettings).doBackup(PerformBackup.BackupCause.STOP); new PerformBackup(this, newSettings).doBackup(PerformBackup.BackupCause.STOP);
} }
final AuthMe pluginInstance = this;
new Thread(new Runnable() { new Thread(new Runnable() {
@Override @Override
public void run() { public void run() {
List<Integer> pendingTasks = new ArrayList<>(); List<Integer> pendingTasks = new ArrayList<>();
for (BukkitTask pendingTask : getServer().getScheduler().getPendingTasks()) { //returns only the async takss
if (pendingTask.getOwner().equals(pluginInstance) && !pendingTask.isSync()) { for (BukkitWorker pendingTask : getServer().getScheduler().getActiveWorkers()) {
if (pendingTask.getOwner().equals(AuthMe.this)
//it's not a peridic task
&& !getServer().getScheduler().isQueued(pendingTask.getTaskId())) {
pendingTasks.add(pendingTask.getTaskId()); pendingTasks.add(pendingTask.getTaskId());
} }
} }
getLogger().info("Waiting for " + pendingTasks.size() + " tasks to finish");
getLogger().log(Level.INFO, "Waiting for {0} tasks to finish", pendingTasks.size());
int progress = 0; int progress = 0;
for (int taskId : pendingTasks) {
int maxTries = 5; //one minute + some time checking the running state
while (getServer().getScheduler().isCurrentlyRunning(taskId)) { int tries = 60;
if (maxTries <= 0) { while (!pendingTasks.isEmpty()) {
getLogger().info("Async task " + taskId + " times out after to many tries"); if (tries <= 0) {
break; getLogger().log(Level.INFO, "Async tasks times out after to many tries {0}", pendingTasks);
} break;
try {
Thread.sleep(1000);
} catch (InterruptedException ignored) {
}
maxTries--;
} }
progress++; try {
getLogger().info("Progress: " + progress + " / " + pendingTasks.size()); Thread.sleep(1000);
} catch (InterruptedException ignored) {
Thread.currentThread().interrupt();
break;
}
for (Iterator<Integer> iterator = pendingTasks.iterator(); iterator.hasNext();) {
int taskId = iterator.next();
if (!getServer().getScheduler().isCurrentlyRunning(taskId)) {
iterator.remove();
progress++;
getLogger().log(Level.INFO, "Progress: {0} / {1}", new Object[]{progress, pendingTasks.size()});
}
}
tries--;
} }
if (database != null) { if (database != null) {
database.close(); database.close();
} }

View File

@ -31,34 +31,23 @@ import java.util.Set;
public class MySQL implements DataSource { public class MySQL implements DataSource {
private final String host; private String host;
private final String port; private String port;
private final String username; private String username;
private final String password; private String password;
private final String database; private String database;
private final String tableName; private String tableName;
private final List<String> columnOthers; private List<String> columnOthers;
private final Columns col; private Columns col;
private final HashAlgorithm hashAlgorithm; private HashAlgorithm hashAlgorithm;
private HikariDataSource ds; private HikariDataSource ds;
private final String phpBbPrefix; private String phpBbPrefix;
private final int phpBbGroup; private int phpBbGroup;
private final String wordpressPrefix; private String wordpressPrefix;
public MySQL(NewSetting settings) throws ClassNotFoundException, SQLException, PoolInitializationException { public MySQL(NewSetting settings) throws ClassNotFoundException, SQLException, PoolInitializationException {
this.host = settings.getProperty(DatabaseSettings.MYSQL_HOST); setParameters(settings);
this.port = settings.getProperty(DatabaseSettings.MYSQL_PORT);
this.username = settings.getProperty(DatabaseSettings.MYSQL_USERNAME);
this.password = settings.getProperty(DatabaseSettings.MYSQL_PASSWORD);
this.database = settings.getProperty(DatabaseSettings.MYSQL_DATABASE);
this.tableName = settings.getProperty(DatabaseSettings.MYSQL_TABLE);
this.columnOthers = settings.getProperty(HooksSettings.MYSQL_OTHER_USERNAME_COLS);
this.col = new Columns(settings);
this.hashAlgorithm = settings.getProperty(SecuritySettings.PASSWORD_HASH);
this.phpBbPrefix = settings.getProperty(HooksSettings.PHPBB_TABLE_PREFIX);
this.phpBbGroup = settings.getProperty(HooksSettings.PHPBB_ACTIVATED_GROUP_ID);
this.wordpressPrefix = settings.getProperty(HooksSettings.WORDPRESS_TABLE_PREFIX);
// Set the connection arguments (and check if connection is ok) // Set the connection arguments (and check if connection is ok)
try { try {
@ -67,7 +56,7 @@ public class MySQL implements DataSource {
if (e instanceof IllegalArgumentException) { if (e instanceof IllegalArgumentException) {
ConsoleLogger.showError("Invalid database arguments! Please check your configuration!"); ConsoleLogger.showError("Invalid database arguments! Please check your configuration!");
ConsoleLogger.showError("If this error persists, please report it to the developer!"); ConsoleLogger.showError("If this error persists, please report it to the developer!");
throw new IllegalArgumentException(e); throw e;
} }
if (e instanceof PoolInitializationException) { if (e instanceof PoolInitializationException) {
ConsoleLogger.showError("Can't initialize database connection! Please check your configuration!"); ConsoleLogger.showError("Can't initialize database connection! Please check your configuration!");
@ -80,17 +69,22 @@ public class MySQL implements DataSource {
// Initialize the database // Initialize the database
try { try {
this.setupConnection(); setupConnection();
} catch (SQLException e) { } catch (SQLException e) {
this.close(); close();
ConsoleLogger.showError("Can't initialize the MySQL database... Please check your database settings in the config.yml file! SHUTDOWN..."); ConsoleLogger.logException("Can't initialize the MySQL database:", e);
ConsoleLogger.showError("If this error persists, please report it to the developer!"); ConsoleLogger.showError("Please check your database settings in the config.yml file!");
throw e; throw e;
} }
} }
@VisibleForTesting @VisibleForTesting
MySQL(NewSetting settings, HikariDataSource hikariDataSource) { MySQL(NewSetting settings, HikariDataSource hikariDataSource) {
ds = hikariDataSource;
setParameters(settings);
}
private void setParameters(NewSetting settings) {
this.host = settings.getProperty(DatabaseSettings.MYSQL_HOST); this.host = settings.getProperty(DatabaseSettings.MYSQL_HOST);
this.port = settings.getProperty(DatabaseSettings.MYSQL_PORT); this.port = settings.getProperty(DatabaseSettings.MYSQL_PORT);
this.username = settings.getProperty(DatabaseSettings.MYSQL_USERNAME); this.username = settings.getProperty(DatabaseSettings.MYSQL_USERNAME);
@ -103,7 +97,6 @@ public class MySQL implements DataSource {
this.phpBbPrefix = settings.getProperty(HooksSettings.PHPBB_TABLE_PREFIX); this.phpBbPrefix = settings.getProperty(HooksSettings.PHPBB_TABLE_PREFIX);
this.phpBbGroup = settings.getProperty(HooksSettings.PHPBB_ACTIVATED_GROUP_ID); this.phpBbGroup = settings.getProperty(HooksSettings.PHPBB_ACTIVATED_GROUP_ID);
this.wordpressPrefix = settings.getProperty(HooksSettings.WORDPRESS_TABLE_PREFIX); this.wordpressPrefix = settings.getProperty(HooksSettings.WORDPRESS_TABLE_PREFIX);
ds = hikariDataSource;
} }
private void setConnectionArguments() throws RuntimeException { private void setConnectionArguments() throws RuntimeException {
@ -148,16 +141,14 @@ public class MySQL implements DataSource {
} }
private void setupConnection() throws SQLException { private void setupConnection() throws SQLException {
try (Connection con = getConnection()) { try (Connection con = getConnection(); Statement st = con.createStatement()) {
Statement st = con.createStatement();
DatabaseMetaData md = con.getMetaData();
// Create table if not exists. // Create table if not exists.
String sql = "CREATE TABLE IF NOT EXISTS " + tableName + " (" String sql = "CREATE TABLE IF NOT EXISTS " + tableName + " ("
+ col.ID + " INTEGER AUTO_INCREMENT," + col.ID + " MEDIUMINT(8) UNSIGNED AUTO_INCREMENT,"
+ col.NAME + " VARCHAR(255) NOT NULL UNIQUE," + col.NAME + " VARCHAR(255) NOT NULL UNIQUE,"
+ col.REAL_NAME + " VARCHAR(255) NOT NULL," + col.REAL_NAME + " VARCHAR(255) NOT NULL,"
+ col.PASSWORD + " VARCHAR(255) NOT NULL," + col.PASSWORD + " VARCHAR(255) CHARACTER SET ascii COLLATE ascii_bin NOT NULL,"
+ col.IP + " VARCHAR(40) NOT NULL DEFAULT '127.0.0.1'," + col.IP + " VARCHAR(40) CHARACTER SET ascii COLLATE ascii_bin NOT NULL DEFAULT '127.0.0.1',"
+ col.LAST_LOGIN + " BIGINT NOT NULL DEFAULT 0," + col.LAST_LOGIN + " BIGINT NOT NULL DEFAULT 0,"
+ col.LASTLOC_X + " DOUBLE NOT NULL DEFAULT '0.0'," + col.LASTLOC_X + " DOUBLE NOT NULL DEFAULT '0.0',"
+ col.LASTLOC_Y + " DOUBLE NOT NULL DEFAULT '0.0'," + col.LASTLOC_Y + " DOUBLE NOT NULL DEFAULT '0.0',"
@ -165,100 +156,81 @@ public class MySQL implements DataSource {
+ col.LASTLOC_WORLD + " VARCHAR(255) NOT NULL DEFAULT '" + Settings.defaultWorld + "'," + col.LASTLOC_WORLD + " VARCHAR(255) NOT NULL DEFAULT '" + Settings.defaultWorld + "',"
+ col.EMAIL + " VARCHAR(255) DEFAULT 'your@email.com'," + col.EMAIL + " VARCHAR(255) DEFAULT 'your@email.com',"
+ col.IS_LOGGED + " SMALLINT NOT NULL DEFAULT '0'," + col.IS_LOGGED + " SMALLINT NOT NULL DEFAULT '0',"
+ "CONSTRAINT table_const_prim PRIMARY KEY (" + col.ID + ")" + "PRIMARY KEY (" + col.ID + ")"
+ ");"; + ") CHARACTER SET = utf8";
st.executeUpdate(sql); st.executeUpdate(sql);
ResultSet rs = md.getColumns(null, null, tableName, col.NAME); DatabaseMetaData md = con.getMetaData();
if (!rs.next()) { if (isColumnMissing(md, col.NAME)) {
st.executeUpdate("ALTER TABLE " + tableName st.executeUpdate("ALTER TABLE " + tableName
+ " ADD COLUMN " + col.NAME + " VARCHAR(255) NOT NULL UNIQUE AFTER " + col.ID + ";"); + " ADD COLUMN " + col.NAME + " VARCHAR(255) NOT NULL UNIQUE AFTER " + col.ID + ";");
} }
rs.close();
rs = md.getColumns(null, null, tableName, col.REAL_NAME); if (isColumnMissing(md, col.REAL_NAME)) {
if (!rs.next()) {
st.executeUpdate("ALTER TABLE " + tableName st.executeUpdate("ALTER TABLE " + tableName
+ " ADD COLUMN " + col.REAL_NAME + " VARCHAR(255) NOT NULL AFTER " + col.NAME + ";"); + " ADD COLUMN " + col.REAL_NAME + " VARCHAR(255) NOT NULL AFTER " + col.NAME + ";");
} }
rs.close();
rs = md.getColumns(null, null, tableName, col.PASSWORD); if (isColumnMissing(md, col.PASSWORD)) {
if (!rs.next()) {
st.executeUpdate("ALTER TABLE " + tableName st.executeUpdate("ALTER TABLE " + tableName
+ " ADD COLUMN " + col.PASSWORD + " VARCHAR(255) NOT NULL;"); + " ADD COLUMN " + col.PASSWORD + " VARCHAR(255) CHARACTER SET ascii COLLATE ascii_bin NOT NULL;");
}
rs.close();
if (!col.SALT.isEmpty()) {
rs = md.getColumns(null, null, tableName, col.SALT);
if (!rs.next()) {
st.executeUpdate("ALTER TABLE " + tableName
+ " ADD COLUMN " + col.SALT + " VARCHAR(255);");
}
rs.close();
} }
rs = md.getColumns(null, null, tableName, col.IP); if (!col.SALT.isEmpty() && isColumnMissing(md, col.SALT)) {
if (!rs.next()) {
st.executeUpdate("ALTER TABLE " + tableName st.executeUpdate("ALTER TABLE " + tableName
+ " ADD COLUMN " + col.IP + " VARCHAR(40) NOT NULL;"); + " ADD COLUMN " + col.SALT + " VARCHAR(255);");
} }
rs.close();
rs = md.getColumns(null, null, tableName, col.LAST_LOGIN); if (isColumnMissing(md, col.IP)) {
if (!rs.next()) { st.executeUpdate("ALTER TABLE " + tableName
+ " ADD COLUMN " + col.IP + " VARCHAR(40) CHARACTER SET ascii COLLATE ascii_bin NOT NULL;");
}
if (isColumnMissing(md, col.LAST_LOGIN)) {
st.executeUpdate("ALTER TABLE " + tableName st.executeUpdate("ALTER TABLE " + tableName
+ " ADD COLUMN " + col.LAST_LOGIN + " BIGINT NOT NULL DEFAULT 0;"); + " ADD COLUMN " + col.LAST_LOGIN + " BIGINT NOT NULL DEFAULT 0;");
} else { } else {
migrateLastLoginColumnToBigInt(con, rs); migrateLastLoginColumnToBigInt(con, md);
} }
rs.close();
rs = md.getColumns(null, null, tableName, col.LASTLOC_X); if (isColumnMissing(md, col.LASTLOC_X)) {
if (!rs.next()) {
st.executeUpdate("ALTER TABLE " + tableName + " ADD COLUMN " st.executeUpdate("ALTER TABLE " + tableName + " ADD COLUMN "
+ col.LASTLOC_X + " DOUBLE NOT NULL DEFAULT '0.0' AFTER " + col.LAST_LOGIN + " , ADD " + col.LASTLOC_X + " DOUBLE NOT NULL DEFAULT '0.0' AFTER " + col.LAST_LOGIN + " , ADD "
+ col.LASTLOC_Y + " DOUBLE NOT NULL DEFAULT '0.0' AFTER " + col.LASTLOC_X + " , ADD " + col.LASTLOC_Y + " DOUBLE NOT NULL DEFAULT '0.0' AFTER " + col.LASTLOC_X + " , ADD "
+ col.LASTLOC_Z + " DOUBLE NOT NULL DEFAULT '0.0' AFTER " + col.LASTLOC_Y); + col.LASTLOC_Z + " DOUBLE NOT NULL DEFAULT '0.0' AFTER " + col.LASTLOC_Y);
} } else {
rs.close();
rs = md.getColumns(null, null, tableName, col.LASTLOC_X);
if (rs.next()) {
st.executeUpdate("ALTER TABLE " + tableName + " MODIFY " st.executeUpdate("ALTER TABLE " + tableName + " MODIFY "
+ col.LASTLOC_X + " DOUBLE NOT NULL DEFAULT '0.0', MODIFY " + col.LASTLOC_X + " DOUBLE NOT NULL DEFAULT '0.0', MODIFY "
+ col.LASTLOC_Y + " DOUBLE NOT NULL DEFAULT '0.0', MODIFY " + col.LASTLOC_Y + " DOUBLE NOT NULL DEFAULT '0.0', MODIFY "
+ col.LASTLOC_Z + " DOUBLE NOT NULL DEFAULT '0.0';"); + col.LASTLOC_Z + " DOUBLE NOT NULL DEFAULT '0.0';");
} }
rs.close();
rs = md.getColumns(null, null, tableName, col.LASTLOC_WORLD); if (isColumnMissing(md, col.LASTLOC_WORLD)) {
if (!rs.next()) {
st.executeUpdate("ALTER TABLE " + tableName + " ADD COLUMN " st.executeUpdate("ALTER TABLE " + tableName + " ADD COLUMN "
+ col.LASTLOC_WORLD + " VARCHAR(255) NOT NULL DEFAULT 'world' AFTER " + col.LASTLOC_Z); + col.LASTLOC_WORLD + " VARCHAR(255) NOT NULL DEFAULT 'world' AFTER " + col.LASTLOC_Z);
} }
rs.close();
rs = md.getColumns(null, null, tableName, col.EMAIL); if (isColumnMissing(md, col.EMAIL)) {
if (!rs.next()) {
st.executeUpdate("ALTER TABLE " + tableName + " ADD COLUMN " st.executeUpdate("ALTER TABLE " + tableName + " ADD COLUMN "
+ col.EMAIL + " VARCHAR(255) DEFAULT 'your@email.com' AFTER " + col.LASTLOC_WORLD); + col.EMAIL + " VARCHAR(255) DEFAULT 'your@email.com' AFTER " + col.LASTLOC_WORLD);
} }
rs.close();
rs = md.getColumns(null, null, tableName, col.IS_LOGGED); if (isColumnMissing(md, col.IS_LOGGED)) {
if (!rs.next()) {
st.executeUpdate("ALTER TABLE " + tableName + " ADD COLUMN " st.executeUpdate("ALTER TABLE " + tableName + " ADD COLUMN "
+ col.IS_LOGGED + " SMALLINT NOT NULL DEFAULT '0' AFTER " + col.EMAIL); + col.IS_LOGGED + " SMALLINT NOT NULL DEFAULT '0' AFTER " + col.EMAIL);
} }
rs.close();
st.close(); st.close();
} }
ConsoleLogger.info("MySQL setup finished"); ConsoleLogger.info("MySQL setup finished");
} }
private boolean isColumnMissing(DatabaseMetaData metaData, String columnName) throws SQLException {
try (ResultSet rs = metaData.getColumns(null, null, tableName, columnName)) {
return !rs.next();
}
}
@Override @Override
public boolean isAuthAvailable(String user) { public boolean isAuthAvailable(String user) {
String sql = "SELECT " + col.NAME + " FROM " + tableName + " WHERE " + col.NAME + "=?;"; String sql = "SELECT " + col.NAME + " FROM " + tableName + " WHERE " + col.NAME + "=?;";
@ -933,10 +905,18 @@ public class MySQL implements DataSource {
* Check if the lastlogin column is of type timestamp and, if so, revert it to the bigint format. * Check if the lastlogin column is of type timestamp and, if so, revert it to the bigint format.
* *
* @param con Connection to the database * @param con Connection to the database
* @param rs ResultSet containing meta data for the lastlogin column * @param metaData metaData meta data of the database
*/ */
private void migrateLastLoginColumnToBigInt(Connection con, ResultSet rs) throws SQLException { private void migrateLastLoginColumnToBigInt(Connection con, DatabaseMetaData metaData) throws SQLException {
final int columnType = rs.getInt("DATA_TYPE"); final int columnType;
try (ResultSet rs = metaData.getColumns(null, null, tableName, col.LAST_LOGIN)) {
if (!rs.next()) {
ConsoleLogger.showError("Could not get LAST_LOGIN meta data. This should never happen!");
return;
}
columnType = rs.getInt("DATA_TYPE");
}
if (columnType == Types.TIMESTAMP) { if (columnType == Types.TIMESTAMP) {
ConsoleLogger.info("Migrating lastlogin column from timestamp to bigint"); ConsoleLogger.info("Migrating lastlogin column from timestamp to bigint");
final String lastLoginOld = col.LAST_LOGIN + "_old"; final String lastLoginOld = col.LAST_LOGIN + "_old";

View File

@ -31,7 +31,7 @@ import java.lang.reflect.InvocationTargetException;
import java.util.Arrays; import java.util.Arrays;
import java.util.logging.Level; import java.util.logging.Level;
public class AuthMeInventoryPacketAdapter extends PacketAdapter { class AuthMeInventoryPacketAdapter extends PacketAdapter {
private static final int PLAYER_INVENTORY = 0; private static final int PLAYER_INVENTORY = 0;
// http://wiki.vg/Inventory#Inventory (0-4 crafting, 5-8 armor, 9-35 main inventory, 36-44 hotbar, 45 off hand) // http://wiki.vg/Inventory#Inventory (0-4 crafting, 5-8 armor, 9-35 main inventory, 36-44 hotbar, 45 off hand)

View File

@ -6,16 +6,12 @@ import com.comphenix.protocol.events.ListenerPriority;
import com.comphenix.protocol.events.PacketAdapter; import com.comphenix.protocol.events.PacketAdapter;
import com.comphenix.protocol.events.PacketEvent; import com.comphenix.protocol.events.PacketEvent;
import com.comphenix.protocol.reflect.FieldAccessException; import com.comphenix.protocol.reflect.FieldAccessException;
import fr.xephi.authme.AuthMe; import fr.xephi.authme.AuthMe;
import fr.xephi.authme.ConsoleLogger; import fr.xephi.authme.ConsoleLogger;
import fr.xephi.authme.cache.auth.PlayerCache; import fr.xephi.authme.cache.auth.PlayerCache;
import javax.inject.Inject; class AuthMeTabCompletePacketAdapter extends PacketAdapter {
public class AuthMeTabCompletePacketAdapter extends PacketAdapter {
@Inject
public AuthMeTabCompletePacketAdapter(AuthMe plugin) { public AuthMeTabCompletePacketAdapter(AuthMe plugin) {
super(plugin, ListenerPriority.NORMAL, PacketType.Play.Client.TAB_COMPLETE); super(plugin, ListenerPriority.NORMAL, PacketType.Play.Client.TAB_COMPLETE);
} }

View File

@ -21,7 +21,6 @@ import fr.xephi.authme.util.BukkitService;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import javax.inject.Inject;
import java.lang.reflect.InvocationTargetException; import java.lang.reflect.InvocationTargetException;
import java.util.Arrays; import java.util.Arrays;
import java.util.Iterator; import java.util.Iterator;
@ -29,12 +28,11 @@ import java.util.List;
import java.util.UUID; import java.util.UUID;
import java.util.logging.Level; import java.util.logging.Level;
public class AuthMeTablistPacketAdapter extends PacketAdapter { class AuthMeTablistPacketAdapter extends PacketAdapter {
private final BukkitService bukkitService; private final BukkitService bukkitService;
private boolean isRegistered; private boolean isRegistered;
@Inject
public AuthMeTablistPacketAdapter(AuthMe plugin, BukkitService bukkitService) { public AuthMeTablistPacketAdapter(AuthMe plugin, BukkitService bukkitService) {
super(plugin, ListenerPriority.NORMAL, PacketType.Play.Server.PLAYER_INFO); super(plugin, ListenerPriority.NORMAL, PacketType.Play.Server.PLAYER_INFO);
this.bukkitService = bukkitService; this.bukkitService = bukkitService;

View File

@ -104,11 +104,9 @@ public class ProtocolLibService implements SettingsDependent {
* @param player The player to send the packet to. * @param player The player to send the packet to.
*/ */
public void sendBlankInventoryPacket(Player player) { public void sendBlankInventoryPacket(Player player) {
if (!isEnabled || inventoryPacketAdapter == null) { if (isEnabled && inventoryPacketAdapter != null) {
return; inventoryPacketAdapter.sendBlankInventoryPacket(player);
} }
inventoryPacketAdapter.sendBlankInventoryPacket(player);
} }
/** /**
@ -117,11 +115,9 @@ public class ProtocolLibService implements SettingsDependent {
* @param player The player to send the packet to. * @param player The player to send the packet to.
*/ */
public void sendTabList(Player player) { public void sendTabList(Player player) {
if (!isEnabled || tablistPacketAdapter == null) { if (isEnabled && tablistPacketAdapter != null) {
return; tablistPacketAdapter.sendTablist(player);
} }
tablistPacketAdapter.sendTablist(player);
} }
@Override @Override

View File

@ -76,7 +76,7 @@ public class PurgeService implements Reloadable {
if (!settings.getProperty(PurgeSettings.USE_AUTO_PURGE)) { if (!settings.getProperty(PurgeSettings.USE_AUTO_PURGE)) {
return; return;
} else if (daysBeforePurge <= 0) { } else if (daysBeforePurge <= 0) {
ConsoleLogger.showError("Configured days before purging must be positive"); ConsoleLogger.showError("Did not run auto purge: configured days before purging must be positive");
return; return;
} }

View File

@ -72,7 +72,7 @@ public class AuthMeInitializationTest {
public void initAuthMe() throws IOException { public void initAuthMe() throws IOException {
dataFolder = temporaryFolder.newFolder(); dataFolder = temporaryFolder.newFolder();
settingsFile = new File(dataFolder, "config.yml"); settingsFile = new File(dataFolder, "config.yml");
Files.copy(TestHelper.getJarFile("/initialization/config.test.yml"), settingsFile); Files.copy(TestHelper.getJarFile(TestHelper.PROJECT_ROOT + "config.test.yml"), settingsFile);
// Mock / wire various Bukkit components // Mock / wire various Bukkit components
given(server.getLogger()).willReturn(mock(Logger.class)); given(server.getLogger()).willReturn(mock(Logger.class));

View File

@ -28,6 +28,8 @@ import static org.mockito.Mockito.verify;
*/ */
public final class TestHelper { public final class TestHelper {
public static final String PROJECT_ROOT = "/fr/xephi/authme/";
private TestHelper() { private TestHelper() {
} }

View File

@ -45,7 +45,7 @@ public class CrazyLoginConverterTest {
private NewSetting settings; private NewSetting settings;
@DataFolder @DataFolder
private File dataFolder = TestHelper.getJarFile("/converter/"); private File dataFolder = TestHelper.getJarFile(TestHelper.PROJECT_ROOT + "converter/");
@BeforeClass @BeforeClass
public static void initializeLogger() { public static void initializeLogger() {

View File

@ -41,7 +41,7 @@ public class ForceFlatToSqliteTest {
@Before @Before
public void copyFile() throws IOException { public void copyFile() throws IOException {
File source = TestHelper.getJarFile("/datasource-integration/flatfile-test.txt"); File source = TestHelper.getJarFile(TestHelper.PROJECT_ROOT + "datasource/flatfile-test.txt");
File destination = temporaryFolder.newFile(); File destination = temporaryFolder.newFile();
Files.copy(source, destination); Files.copy(source, destination);
flatFile = new FlatFile(destination); flatFile = new FlatFile(destination);

View File

@ -35,7 +35,7 @@ public class FlatFileIntegrationTest {
@Before @Before
public void copyFileToTemporaryFolder() throws IOException { public void copyFileToTemporaryFolder() throws IOException {
File originalFile = TestHelper.getJarFile("/datasource-integration/flatfile-test.txt"); File originalFile = TestHelper.getJarFile(TestHelper.PROJECT_ROOT + "datasource/flatfile-test.txt");
File copy = temporaryFolder.newFile(); File copy = temporaryFolder.newFile();
Files.copy(originalFile, copy); Files.copy(originalFile, copy);
dataSource = new FlatFile(copy); dataSource = new FlatFile(copy);

View File

@ -54,7 +54,7 @@ public class MySqlIntegrationTest extends AbstractDataSourceIntegrationTest {
set(DatabaseSettings.MYSQL_TABLE, "authme"); set(DatabaseSettings.MYSQL_TABLE, "authme");
TestHelper.setupLogger(); TestHelper.setupLogger();
Path sqlInitFile = TestHelper.getJarPath("/datasource-integration/sql-initialize.sql"); Path sqlInitFile = TestHelper.getJarPath(TestHelper.PROJECT_ROOT + "datasource/sql-initialize.sql");
sqlInitialize = new String(Files.readAllBytes(sqlInitFile)); sqlInitialize = new String(Files.readAllBytes(sqlInitFile));
} }

View File

@ -53,7 +53,7 @@ public class SQLiteIntegrationTest extends AbstractDataSourceIntegrationTest {
set(DatabaseSettings.MYSQL_TABLE, "authme"); set(DatabaseSettings.MYSQL_TABLE, "authme");
TestHelper.setupLogger(); TestHelper.setupLogger();
Path sqlInitFile = TestHelper.getJarPath("/datasource-integration/sql-initialize.sql"); Path sqlInitFile = TestHelper.getJarPath(TestHelper.PROJECT_ROOT + "datasource/sql-initialize.sql");
// Note ljacqu 20160221: It appears that we can only run one statement per Statement.execute() so we split // Note ljacqu 20160221: It appears that we can only run one statement per Statement.execute() so we split
// the SQL file by ";\n" as to get the individual statements // the SQL file by ";\n" as to get the individual statements
sqlInitialize = new String(Files.readAllBytes(sqlInitFile)).split(";(\\r?)\\n"); sqlInitialize = new String(Files.readAllBytes(sqlInitFile)).split(";(\\r?)\\n");

View File

@ -33,8 +33,8 @@ import static org.mockito.Mockito.verify;
*/ */
public class MessagesIntegrationTest { public class MessagesIntegrationTest {
private static final String YML_TEST_FILE = "/messages_test.yml"; private static final String YML_TEST_FILE = TestHelper.PROJECT_ROOT + "output/messages_test.yml";
private static final String YML_DEFAULT_TEST_FILE = "/messages_default.yml"; private static final String YML_DEFAULT_TEST_FILE = TestHelper.PROJECT_ROOT + "output/messages_default.yml";
private Messages messages; private Messages messages;
@BeforeClass @BeforeClass
@ -255,7 +255,8 @@ public class MessagesIntegrationTest {
// assumption: message comes back as defined in messages_test.yml // assumption: message comes back as defined in messages_test.yml
assumeThat(messages.retrieveSingle(key), equalTo("§cWrong password!")); assumeThat(messages.retrieveSingle(key), equalTo("§cWrong password!"));
NewSetting settings = mock(NewSetting.class); NewSetting settings = mock(NewSetting.class);
given(settings.getMessagesFile()).willReturn(TestHelper.getJarFile("/messages_test2.yml")); given(settings.getMessagesFile()).willReturn(TestHelper.getJarFile(
TestHelper.PROJECT_ROOT + "output/messages_test2.yml"));
// when // when
messages.loadSettings(settings); messages.loadSettings(settings);

View File

@ -6,7 +6,7 @@ import org.junit.Ignore;
* Test for {@link CryptPBKDF2}. * Test for {@link CryptPBKDF2}.
*/ */
@Ignore @Ignore
// TODO #369: This algorithm seems broken // TODO #685: This algorithm seems broken
public class CryptPBKDF2Test extends AbstractEncryptionMethodTest { public class CryptPBKDF2Test extends AbstractEncryptionMethodTest {
public CryptPBKDF2Test() { public CryptPBKDF2Test() {

View File

@ -32,11 +32,11 @@ import static org.junit.Assert.assertThat;
public class NewSettingIntegrationTest { public class NewSettingIntegrationTest {
/** File name of the sample config including all {@link TestConfiguration} values. */ /** File name of the sample config including all {@link TestConfiguration} values. */
private static final String COMPLETE_FILE = "/config-sample-values.yml"; private static final String COMPLETE_FILE = TestHelper.PROJECT_ROOT + "settings/config-sample-values.yml";
/** File name of the sample config missing certain {@link TestConfiguration} values. */ /** File name of the sample config missing certain {@link TestConfiguration} values. */
private static final String INCOMPLETE_FILE = "/config-incomplete-sample.yml"; private static final String INCOMPLETE_FILE = TestHelper.PROJECT_ROOT + "settings/config-incomplete-sample.yml";
/** File name for testing difficult values. */ /** File name for testing difficult values. */
private static final String DIFFICULT_FILE = "/config-difficult-values.yml"; private static final String DIFFICULT_FILE = TestHelper.PROJECT_ROOT + "settings/config-difficult-values.yml";
private static PropertyMap propertyMap = TestConfiguration.generatePropertyMap(); private static PropertyMap propertyMap = TestConfiguration.generatePropertyMap();

View File

@ -54,7 +54,7 @@ public class SpawnLoaderTest {
public void setup() throws IOException { public void setup() throws IOException {
// Copy test config into a new temporary folder // Copy test config into a new temporary folder
testFolder = temporaryFolder.newFolder(); testFolder = temporaryFolder.newFolder();
File source = TestHelper.getJarFile("/spawn/spawn-firstspawn.yml"); File source = TestHelper.getJarFile(TestHelper.PROJECT_ROOT + "settings/spawn-firstspawn.yml");
File destination = new File(testFolder, "spawn.yml"); File destination = new File(testFolder, "spawn.yml");
Files.copy(source, destination); Files.copy(source, destination);

View File

@ -0,0 +1,5 @@
: Shortcut for quickbuild / move to plugins / run server
call quick_build.bat
call move_plugin.bat
call run_server.bat

View File

@ -1,11 +1,10 @@
: Moves the AuthMe JAR file to the plugins folder of the test server : Moves the AuthMe JAR file to the plugins folder of the test server
: You will have to hit 'Y' to really replace it if it already exists
if "%jarfile%" == "" ( if "%jarfile%" == "" (
call setvars.bat call setvars.bat
) )
if exist %jarfile% ( if exist %jarfile% (
xcopy %jarfile% %plugins% xcopy %jarfile% %plugins% /y
) else ( ) else (
echo Target file not found: '%jarfile%' echo Target file not found: '%jarfile%'
) )

View File

@ -3,4 +3,4 @@ if "%jarfile%" == "" (
call setvars.bat call setvars.bat
) )
mvn install -f "%pomfile%" -Dmaven.test.skip mvn install -o -f "%pomfile%" -Dmaven.test.skip