Set up logger at start of initialization to avoid NPE on errors later on

- Thanks to sgdc3 for the hint
This commit is contained in:
ljacqu 2019-08-11 11:32:03 +02:00
parent 647ee245e0
commit 363e85e363
2 changed files with 34 additions and 20 deletions

View File

@ -12,7 +12,6 @@ import fr.xephi.authme.initialization.OnShutdownPlayerSaver;
import fr.xephi.authme.initialization.OnStartupTasks; import fr.xephi.authme.initialization.OnStartupTasks;
import fr.xephi.authme.initialization.SettingsProvider; import fr.xephi.authme.initialization.SettingsProvider;
import fr.xephi.authme.initialization.TaskCloser; import fr.xephi.authme.initialization.TaskCloser;
import fr.xephi.authme.output.ConsoleLoggerFactory;
import fr.xephi.authme.listener.BlockListener; import fr.xephi.authme.listener.BlockListener;
import fr.xephi.authme.listener.EntityListener; import fr.xephi.authme.listener.EntityListener;
import fr.xephi.authme.listener.PlayerListener; import fr.xephi.authme.listener.PlayerListener;
@ -20,6 +19,7 @@ import fr.xephi.authme.listener.PlayerListener111;
import fr.xephi.authme.listener.PlayerListener19; import fr.xephi.authme.listener.PlayerListener19;
import fr.xephi.authme.listener.PlayerListener19Spigot; import fr.xephi.authme.listener.PlayerListener19Spigot;
import fr.xephi.authme.listener.ServerListener; import fr.xephi.authme.listener.ServerListener;
import fr.xephi.authme.output.ConsoleLoggerFactory;
import fr.xephi.authme.security.crypts.Sha256; import fr.xephi.authme.security.crypts.Sha256;
import fr.xephi.authme.service.BackupService; import fr.xephi.authme.service.BackupService;
import fr.xephi.authme.service.BukkitService; import fr.xephi.authme.service.BukkitService;
@ -43,6 +43,7 @@ import org.bukkit.plugin.java.JavaPluginLoader;
import org.bukkit.scheduler.BukkitScheduler; import org.bukkit.scheduler.BukkitScheduler;
import java.io.File; import java.io.File;
import java.util.function.Consumer;
import static fr.xephi.authme.service.BukkitService.TICKS_PER_MINUTE; import static fr.xephi.authme.service.BukkitService.TICKS_PER_MINUTE;
import static fr.xephi.authme.util.Utils.isClassLoaded; import static fr.xephi.authme.util.Utils.isClassLoaded;
@ -119,16 +120,20 @@ public class AuthMe extends JavaPlugin {
// Load the plugin version data from the plugin description file // Load the plugin version data from the plugin description file
loadPluginInfo(getDescription().getVersion()); loadPluginInfo(getDescription().getVersion());
// Set the Logger instance and log file path
ConsoleLogger.initialize(getLogger(), new File(getDataFolder(), LOG_FILENAME));
logger = ConsoleLoggerFactory.get(AuthMe.class);
// Check server version // Check server version
if (!isClassLoaded("org.bukkit.event.player.PlayerInteractAtEntityEvent")) { if (!isClassLoaded("org.bukkit.event.player.PlayerInteractAtEntityEvent")) {
getLogger().warning("You are running an unsupported server version! AuthMe requires MC 1.8.X or later!"); logger.warning("You are running an unsupported server version! AuthMe requires MC 1.8.X or later!");
stopOrUnload(); stopOrUnload();
return; return;
} }
// Prevent running AuthMeBridge due to major exploit issues // Prevent running AuthMeBridge due to major exploit issues
if (getServer().getPluginManager().isPluginEnabled("AuthMeBridge")) { if (getServer().getPluginManager().isPluginEnabled("AuthMeBridge")) {
getLogger().warning("Detected AuthMeBridge, support for it has been dropped as it was " logger.warning("Detected AuthMeBridge, support for it has been dropped as it was "
+ "causing exploit issues, please use AuthMeBungee instead! Aborting!"); + "causing exploit issues, please use AuthMeBungee instead! Aborting!");
stopOrUnload(); stopOrUnload();
return; return;
@ -153,6 +158,10 @@ public class AuthMe extends JavaPlugin {
// Show settings warnings // Show settings warnings
injector.getSingleton(SettingsWarner.class).logWarningsForMisconfigurations(); injector.getSingleton(SettingsWarner.class).logWarningsForMisconfigurations();
// Schedule clean up task
CleanupTask cleanupTask = injector.getSingleton(CleanupTask.class);
cleanupTask.runTaskTimerAsynchronously(this, CLEANUP_INTERVAL, CLEANUP_INTERVAL);
// Do a backup on start // Do a backup on start
backupService.doBackup(BackupService.BackupCause.START); backupService.doBackup(BackupService.BackupCause.START);
@ -165,10 +174,6 @@ public class AuthMe extends JavaPlugin {
// Purge on start if enabled // Purge on start if enabled
PurgeService purgeService = injector.getSingleton(PurgeService.class); PurgeService purgeService = injector.getSingleton(PurgeService.class);
purgeService.runAutoPurge(); purgeService.runAutoPurge();
// Schedule clean up task
CleanupTask cleanupTask = injector.getSingleton(CleanupTask.class);
cleanupTask.runTaskTimerAsynchronously(this, CLEANUP_INTERVAL, CLEANUP_INTERVAL);
} }
/** /**
@ -191,9 +196,6 @@ public class AuthMe extends JavaPlugin {
* Initialize the plugin and all the services. * Initialize the plugin and all the services.
*/ */
private void initialize() { private void initialize() {
// Set the Logger instance and log file path
ConsoleLogger.initialize(getLogger(), new File(getDataFolder(), LOG_FILENAME));
// Check java version // Check java version
if (!SystemUtils.isJavaVersionAtLeast(1.8f)) { if (!SystemUtils.isJavaVersionAtLeast(1.8f)) {
throw new IllegalStateException("You need Java 1.8 or above to run this plugin!"); throw new IllegalStateException("You need Java 1.8 or above to run this plugin!");
@ -217,7 +219,6 @@ public class AuthMe extends JavaPlugin {
// Get settings and set up logger // Get settings and set up logger
settings = injector.getSingleton(Settings.class); settings = injector.getSingleton(Settings.class);
ConsoleLoggerFactory.reloadSettings(settings); ConsoleLoggerFactory.reloadSettings(settings);
logger = ConsoleLoggerFactory.get(AuthMe.class);
OnStartupTasks.setupConsoleFilter(getLogger()); OnStartupTasks.setupConsoleFilter(getLogger());
// Set all service fields on the AuthMe class // Set all service fields on the AuthMe class
@ -226,7 +227,6 @@ public class AuthMe extends JavaPlugin {
// Convert deprecated PLAINTEXT hash entries // Convert deprecated PLAINTEXT hash entries
MigrationService.changePlainTextToSha256(settings, database, new Sha256()); MigrationService.changePlainTextToSha256(settings, database, new Sha256());
//TODO: does this still make sense? -sgdc3
// If the server is empty (fresh start) just set all the players as unlogged // If the server is empty (fresh start) just set all the players as unlogged
if (bukkitService.getOnlinePlayers().isEmpty()) { if (bukkitService.getOnlinePlayers().isEmpty()) {
database.purgeLogged(); database.purgeLogged();
@ -321,7 +321,8 @@ public class AuthMe extends JavaPlugin {
new TaskCloser(this, database).run(); new TaskCloser(this, database).run();
// Disabled correctly // Disabled correctly
logger.info("AuthMe " + this.getDescription().getVersion() + " disabled!"); Consumer<String> infoLogMethod = logger == null ? getLogger()::info : logger::info;
infoLogMethod.accept("AuthMe " + this.getDescription().getVersion() + " disabled!");
ConsoleLogger.closeFileWriter(); ConsoleLogger.closeFileWriter();
} }

View File

@ -24,8 +24,8 @@ import org.bukkit.Server;
import org.bukkit.plugin.PluginDescriptionFile; import org.bukkit.plugin.PluginDescriptionFile;
import org.bukkit.plugin.PluginManager; import org.bukkit.plugin.PluginManager;
import org.bukkit.plugin.java.JavaPluginLoader; import org.bukkit.plugin.java.JavaPluginLoader;
import org.bukkit.scheduler.BukkitScheduler;
import org.junit.Before; import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Rule; import org.junit.Rule;
import org.junit.Test; import org.junit.Test;
import org.junit.rules.TemporaryFolder; import org.junit.rules.TemporaryFolder;
@ -46,6 +46,7 @@ import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.BDDMockito.given; import static org.mockito.BDDMockito.given;
import static org.mockito.Mockito.RETURNS_DEEP_STUBS; import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
import static org.mockito.Mockito.mock; import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
/** /**
* Integration test verifying that all services can be initialized in {@link AuthMe} * Integration test verifying that all services can be initialized in {@link AuthMe}
@ -66,11 +67,6 @@ public class AuthMeInitializationTest {
@Rule @Rule
public TemporaryFolder temporaryFolder = new TemporaryFolder(); public TemporaryFolder temporaryFolder = new TemporaryFolder();
@BeforeClass
public static void setUpLogger() {
TestHelper.setupLogger();
}
@Before @Before
public void initAuthMe() throws IOException { public void initAuthMe() throws IOException {
dataFolder = temporaryFolder.newFolder(); dataFolder = temporaryFolder.newFolder();
@ -98,9 +94,10 @@ public class AuthMeInitializationTest {
given(reader.getList(anyString())).willReturn(Collections.emptyList()); given(reader.getList(anyString())).willReturn(Collections.emptyList());
PropertyResource resource = mock(PropertyResource.class); PropertyResource resource = mock(PropertyResource.class);
given(resource.createReader()).willReturn(reader); given(resource.createReader()).willReturn(reader);
Settings settings = new Settings(dataFolder, resource, null, buildConfigurationData()); Settings settings = new Settings(dataFolder, resource, null, buildConfigurationData());
TestHelper.setupLogger();
Injector injector = new InjectorBuilder() Injector injector = new InjectorBuilder()
.addDefaultHandlers("fr.xephi.authme") .addDefaultHandlers("fr.xephi.authme")
.create(); .create();
@ -130,4 +127,20 @@ public class AuthMeInitializationTest {
assertThat(injector.getIfAvailable(ProcessSyncPlayerLogin.class), not(nullValue())); assertThat(injector.getIfAvailable(ProcessSyncPlayerLogin.class), not(nullValue()));
assertThat(injector.getIfAvailable(PurgeService.class), not(nullValue())); assertThat(injector.getIfAvailable(PurgeService.class), not(nullValue()));
} }
@Test
public void shouldHandlePrematureShutdownGracefully() {
// given
BukkitScheduler scheduler = mock(BukkitScheduler.class);
given(server.getScheduler()).willReturn(scheduler);
// Make sure ConsoleLogger has no logger reference since that may happen on unexpected stops
ReflectionTestUtils.setField(ConsoleLogger.class, null, "logger", null);
// when
authMe.onDisable();
// then - no exceptions
verify(scheduler).getActiveWorkers(); // via TaskCloser
}
} }