From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Minecrell Date: Thu, 21 Sep 2017 19:41:20 +0200 Subject: [PATCH] Add workaround for plugins modifying the parent of the plugin logger Essentials uses a custom logger name ("Essentials") instead of the plugin logger. Log messages are redirected to the plugin logger by setting the parent of the "Essentials" logger to the plugin logger. With our changes, the plugin logger is now also called "Essentials", resulting in an infinite loop. Make sure plugins can't change the parent of the plugin logger to avoid this. diff --git a/src/main/java/com/destroystokyo/paper/utils/PaperPluginLogger.java b/src/main/java/com/destroystokyo/paper/utils/PaperPluginLogger.java new file mode 100644 index 0000000000000000000000000000000000000000..087ee57fe5485bc760fadd45a176d4d90a18f9f8 --- /dev/null +++ b/src/main/java/com/destroystokyo/paper/utils/PaperPluginLogger.java @@ -0,0 +1,48 @@ +package com.destroystokyo.paper.utils; + +import io.papermc.paper.plugin.configuration.PluginMeta; +import org.bukkit.plugin.PluginDescriptionFile; + +import java.util.logging.Level; +import java.util.logging.LogManager; +import java.util.logging.Logger; +import org.jetbrains.annotations.NotNull; + +/** + * Prevents plugins (e.g. Essentials) from changing the parent of the plugin logger. + */ +public class PaperPluginLogger extends Logger { + + @Deprecated(forRemoval = true) + @NotNull + public static Logger getLogger(@NotNull PluginDescriptionFile description) { + return getLogger((PluginMeta) description); + } + + @NotNull + public static Logger getLogger(@NotNull PluginMeta meta) { + Logger logger = new PaperPluginLogger(meta); + if (!LogManager.getLogManager().addLogger(logger)) { + // Disable this if it's going to happen across reloads anyways... + //logger.log(Level.WARNING, "Could not insert plugin logger - one was already found: {}", LogManager.getLogManager().getLogger(this.getName())); + logger = LogManager.getLogManager().getLogger(meta.getLoggerPrefix() != null ? meta.getLoggerPrefix() : meta.getName()); + } + + return logger; + } + + private PaperPluginLogger(@NotNull PluginMeta meta) { + super(meta.getLoggerPrefix() != null ? meta.getLoggerPrefix() : meta.getName(), null); + } + + @Override + public void setParent(@NotNull Logger parent) { + if (getParent() != null) { + warning("Ignoring attempt to change parent of plugin logger"); + } else { + this.log(Level.FINE, "Setting plugin logger parent to {0}", parent); + super.setParent(parent); + } + } + +} diff --git a/src/main/java/org/bukkit/plugin/java/JavaPlugin.java b/src/main/java/org/bukkit/plugin/java/JavaPlugin.java index 79df67daf2fe8193fd83dd6a7bfc78b3f6e524c2..0e4cedc005466c600ff6b9d500febf338b12a842 100644 --- a/src/main/java/org/bukkit/plugin/java/JavaPlugin.java +++ b/src/main/java/org/bukkit/plugin/java/JavaPlugin.java @@ -44,7 +44,7 @@ public abstract class JavaPlugin extends PluginBase { private boolean naggable = true; private FileConfiguration newConfig = null; private File configFile = null; - private Logger logger = null; // Paper - PluginLogger -> Logger + public Logger logger = null; // Paper - PluginLogger -> Logger, public public JavaPlugin() { // Paper start @@ -302,7 +302,11 @@ public abstract class JavaPlugin extends PluginBase { this.classLoader = classLoader; this.configFile = new File(dataFolder, "config.yml"); this.pluginMeta = configuration; // Paper - this.logger = Logger.getLogger(description.getPrefix() != null ? description.getPrefix() : description.getName()); // Paper - Handle plugin prefix in implementation + // Paper start + if (this.logger == null) { + this.logger = com.destroystokyo.paper.utils.PaperPluginLogger.getLogger(this.description); + } + // Paper end } /** diff --git a/src/main/java/org/bukkit/plugin/java/PluginClassLoader.java b/src/main/java/org/bukkit/plugin/java/PluginClassLoader.java index c5f49ba2d0cc5cdf127670ea2be59f1b174dc94b..1c6542bb9ce13781c8f3b84330b5ef5aa52d0348 100644 --- a/src/main/java/org/bukkit/plugin/java/PluginClassLoader.java +++ b/src/main/java/org/bukkit/plugin/java/PluginClassLoader.java @@ -66,7 +66,7 @@ public final class PluginClassLoader extends URLClassLoader implements io.paperm this.url = file.toURI().toURL(); this.libraryLoader = libraryLoader; - + this.logger = com.destroystokyo.paper.utils.PaperPluginLogger.getLogger(description); // Paper - Register logger early // Paper start this.classLoaderGroup = io.papermc.paper.plugin.provider.classloader.PaperClassLoaderStorage.instance().registerSpigotGroup(this); // Paper this.dependencyContext = dependencyContext; @@ -260,6 +260,7 @@ public final class PluginClassLoader extends URLClassLoader implements io.paperm pluginState = new IllegalStateException("Initial initialization"); this.pluginInit = javaPlugin; + javaPlugin.logger = this.logger; // Paper - set logger javaPlugin.init(null, org.bukkit.Bukkit.getServer(), description, dataFolder, file, this); // Paper }