117 lines
		
	
	
	
		
			5.3 KiB
			
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			117 lines
		
	
	
	
		
			5.3 KiB
			
		
	
	
	
		
			Diff
		
	
	
	
	
	
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
 | 
						|
From: Minecrell <minecrell@minecrell.net>
 | 
						|
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..76f2cb9cd99cad2a9484eab2becd8c36f1dd91b3
 | 
						|
--- /dev/null
 | 
						|
+++ b/src/main/java/com/destroystokyo/paper/utils/PaperPluginLogger.java
 | 
						|
@@ -0,0 +1,41 @@
 | 
						|
+package com.destroystokyo.paper.utils;
 | 
						|
+
 | 
						|
+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 {
 | 
						|
+
 | 
						|
+    @NotNull
 | 
						|
+    public static Logger getLogger(@NotNull PluginDescriptionFile description) {
 | 
						|
+        Logger logger = new PaperPluginLogger(description);
 | 
						|
+        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(description.getPrefix() != null ? description.getPrefix() : description.getName());
 | 
						|
+        }
 | 
						|
+
 | 
						|
+        return logger;
 | 
						|
+    }
 | 
						|
+
 | 
						|
+    private PaperPluginLogger(@NotNull PluginDescriptionFile description) {
 | 
						|
+        super(description.getPrefix() != null ? description.getPrefix() : description.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 1ff0e0ef1aebec5bbb0a8a09af11d07b2a3220e8..3bea5dd67ad0393160ccede4ac99a3c7baa1803b 100644
 | 
						|
--- a/src/main/java/org/bukkit/plugin/java/JavaPlugin.java
 | 
						|
+++ b/src/main/java/org/bukkit/plugin/java/JavaPlugin.java
 | 
						|
@@ -43,7 +43,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
 | 
						|
+    Logger logger = null; // Paper - PluginLogger -> Logger, package-private
 | 
						|
 
 | 
						|
     public JavaPlugin() {
 | 
						|
         final ClassLoader classLoader = this.getClass().getClassLoader();
 | 
						|
@@ -277,8 +277,11 @@ public abstract class JavaPlugin extends PluginBase {
 | 
						|
         this.dataFolder = dataFolder;
 | 
						|
         this.classLoader = classLoader;
 | 
						|
         this.configFile = new File(dataFolder, "config.yml");
 | 
						|
-        // Paper - Handle plugin prefix in implementation
 | 
						|
-        this.logger = Logger.getLogger(description.getPrefix() != null ? description.getPrefix() : description.getName());
 | 
						|
+        // 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 6148b69af39344f758b05a28c7c572befa9b8f3f..0db641f5d5e1293b236ad0d2e3a156802ffed839 100644
 | 
						|
--- a/src/main/java/org/bukkit/plugin/java/PluginClassLoader.java
 | 
						|
+++ b/src/main/java/org/bukkit/plugin/java/PluginClassLoader.java
 | 
						|
@@ -44,6 +44,7 @@ public final class PluginClassLoader extends URLClassLoader { // Spigot
 | 
						|
     private JavaPlugin pluginInit;
 | 
						|
     private IllegalStateException pluginState;
 | 
						|
     private final Set<String> seenIllegalAccess = Collections.newSetFromMap(new ConcurrentHashMap<>());
 | 
						|
+    private java.util.logging.Logger logger; // Paper - add field
 | 
						|
 
 | 
						|
     static {
 | 
						|
         ClassLoader.registerAsParallelCapable();
 | 
						|
@@ -62,6 +63,8 @@ public final class PluginClassLoader extends URLClassLoader { // Spigot
 | 
						|
         this.url = file.toURI().toURL();
 | 
						|
         this.libraryLoader = libraryLoader;
 | 
						|
 
 | 
						|
+        this.logger = com.destroystokyo.paper.utils.PaperPluginLogger.getLogger(description); // Paper - Register logger early
 | 
						|
+
 | 
						|
         try {
 | 
						|
             Class<?> jarClass;
 | 
						|
             try {
 | 
						|
@@ -229,6 +232,7 @@ public final class PluginClassLoader extends URLClassLoader { // Spigot
 | 
						|
         pluginState = new IllegalStateException("Initial initialization");
 | 
						|
         this.pluginInit = javaPlugin;
 | 
						|
 
 | 
						|
+        javaPlugin.logger = this.logger; // Paper - set logger
 | 
						|
         javaPlugin.init(loader, loader.server, description, dataFolder, file, this);
 | 
						|
     }
 | 
						|
 }
 |