aboutsummaryrefslogtreecommitdiffhomepage
path: root/Spigot-API-Patches/0068-Add-workaround-for-plugins-modifying-the-parent-of-t.patch
blob: 7aed5d070d0301d2d0e00ddb2bf86f409d72d1cc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
From ab3fa3cb5c5e5389c8fb4900b9e5fb6800e11be1 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 000000000..76f2cb9cd
--- /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 9a3427882..96ebe72ca 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
+    Logger logger = null; // Paper - PluginLogger -> Logger, package-private
 
     public JavaPlugin() {
         final ClassLoader classLoader = this.getClass().getClassLoader();
@@ -278,8 +278,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 c39fcac5a..0df1926fa 100644
--- a/src/main/java/org/bukkit/plugin/java/PluginClassLoader.java
+++ b/src/main/java/org/bukkit/plugin/java/PluginClassLoader.java
@@ -38,6 +38,7 @@ public final class PluginClassLoader extends URLClassLoader { // Spigot
     final JavaPlugin plugin;
     private JavaPlugin pluginInit;
     private IllegalStateException pluginState;
+    private java.util.logging.Logger logger; // Paper - add field
 
     static {
         ClassLoader.registerAsParallelCapable();
@@ -55,6 +56,8 @@ public final class PluginClassLoader extends URLClassLoader { // Spigot
         this.manifest = jar.getManifest();
         this.url = file.toURI().toURL();
 
+        this.logger = com.destroystokyo.paper.utils.PaperPluginLogger.getLogger(description); // Paper - Register logger early
+
         try {
             Class<?> jarClass;
             try {
@@ -172,6 +175,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);
     }
 }
-- 
2.21.0