diff --git a/pom.xml b/pom.xml
index b47a3f8..aa6f2b3 100644
--- a/pom.xml
+++ b/pom.xml
@@ -3,7 +3,7 @@
4.0.0
pw.yumc
Yum
- 2.0.3
+ 2.1
Yum
Minecraft 服务器插件管理系统
diff --git a/src/main/java/pw/yumc/Yum/Yum.java b/src/main/java/pw/yumc/Yum/Yum.java
index c24516f..82e9fb5 100644
--- a/src/main/java/pw/yumc/Yum/Yum.java
+++ b/src/main/java/pw/yumc/Yum/Yum.java
@@ -24,6 +24,11 @@ public class Yum extends JavaPlugin {
public FileConfig config;
NetworkManager netmgr;
+ @Override
+ public FileConfig getConfig() {
+ return config;
+ }
+
@Override
public void onDisable() {
netmgr.unregister();
@@ -35,8 +40,6 @@ public class Yum extends JavaPlugin {
new YumCommand(this);
new FileCommand(this);
new VersionChecker(this);
- netmgr = new NetworkManager(this);
- netmgr.setDebug(true).register();
YumAPI.updaterepo(Bukkit.getConsoleSender());
YumAPI.updatecheck(Bukkit.getConsoleSender());
}
@@ -46,5 +49,7 @@ public class Yum extends JavaPlugin {
config = new FileConfig(this);
// 初始化更新列
UpdatePlugin.getUpdateList();
+ // 启用网络注入
+ netmgr = new NetworkManager().register(this);
}
}
diff --git a/src/main/java/pw/yumc/Yum/manager/NetworkManager.java b/src/main/java/pw/yumc/Yum/manager/NetworkManager.java
index 8fbb591..ab7553f 100644
--- a/src/main/java/pw/yumc/Yum/manager/NetworkManager.java
+++ b/src/main/java/pw/yumc/Yum/manager/NetworkManager.java
@@ -11,6 +11,7 @@ import java.util.List;
import org.bukkit.Bukkit;
import org.bukkit.plugin.Plugin;
+import cn.citycraft.PluginHelper.config.FileConfig;
import pw.yumc.Yum.Yum;
/**
@@ -20,38 +21,42 @@ import pw.yumc.Yum.Yum;
* @author 喵♂呜
*/
public class NetworkManager {
- private static boolean debug;
-
- private final Yum main;
-
- public NetworkManager(final Yum plugin) {
- this.main = plugin;
+ public static void throwException(final Throwable exception) {
+ NetworkManager. throwException0(exception);
}
- public void register() {
- main.getLogger().info("注入网络代理 将托管服务器网络!");
- ProxySelector.setDefault(new YumProxySelector(ProxySelector.getDefault()));
+ @SuppressWarnings("unchecked")
+ private static void throwException0(final Throwable exception) throws T {
+ throw (T) exception;
}
- public NetworkManager setDebug(final boolean debug) {
- NetworkManager.debug = debug;
+ public NetworkManager register(final Yum plugin) {
+ plugin.getLogger().info("注入网络代理 将托管服务器网络!");
+ ProxySelector.setDefault(new YumProxySelector(ProxySelector.getDefault(), plugin));
return this;
}
public void unregister() {
final ProxySelector cur = ProxySelector.getDefault();
if (cur instanceof YumProxySelector) {
- main.getLogger().info("恢复网络代理 使用默认网络!");
ProxySelector.setDefault(((YumProxySelector) cur).getDefaultSelector());
}
}
class YumProxySelector extends ProxySelector {
+ private final boolean debug;
+ private final boolean allowPrimaryThread;
+ private final Yum main;
+ private final FileConfig config;
private final ProxySelector defaultSelector;
private final HashMap pluginMap = new HashMap<>();
- public YumProxySelector(final ProxySelector defaultSelector) {
+ public YumProxySelector(final ProxySelector defaultSelector, final Yum plugin) {
+ this.main = plugin;
+ this.config = plugin.getConfig();
this.defaultSelector = defaultSelector;
+ this.debug = config.getBoolean("NetworkDebug");
+ this.allowPrimaryThread = config.getBoolean("AllowPrimaryThread");
}
@Override
@@ -66,18 +71,19 @@ public class NetworkManager {
@Override
public List select(final URI uri) {
if (debug || Bukkit.isPrimaryThread()) {
- try {
- final Plugin plugin = this.getRequestingPlugin();
- final String urlinfo = uri.getHost() + ":" + uri.getPort() + "/" + uri.getPath();
+ final Plugin plugin = this.getRequestingPlugin();
+ final String urlinfo = uri.toString();
+ if (!urlinfo.startsWith("socket") && !urlinfo.toLowerCase().contains("yumc") && !urlinfo.toLowerCase().contains("pom.xml")) {
final String str = debug ? "[NetDebug] 插件 %s 尝试访问 %s 请注意服务器网络安全!" : "[NetManager] 插件 %s 尝试在主线程访问 %s 可能会导致服务器卡顿或无响应!";
if (plugin == null) {
main.getLogger().warning(String.format(str, "未知(请查看堆栈)", urlinfo));
Thread.dumpStack();
} else if (!plugin.getName().equalsIgnoreCase("Yum")) {
main.getLogger().warning(String.format(str, plugin.getName(), urlinfo));
+ if (!allowPrimaryThread) {
+ throwException(new IOException("[NetManager] 已阻止插件 " + plugin.getName() + " 在主线程访问网络!"));
+ }
}
- } catch (final Exception e) {
- e.printStackTrace();
}
}
return defaultSelector.select(uri);
@@ -99,7 +105,10 @@ public class NetworkManager {
try {
final ClassLoader loader = Class.forName(element.getClassName(), false, getClass().getClassLoader()).getClassLoader();
if (pluginMap.containsKey(loader)) {
- return pluginMap.get(loader);
+ final Plugin p = pluginMap.get(loader);
+ if (element.getClassName().contains("pw.yumc.Yum.utils.") || !p.getName().equalsIgnoreCase("Yum")) {
+ return p;
+ }
}
} catch (final ClassNotFoundException ex) {
}
diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml
index f7b6ba3..f1282f4 100644
--- a/src/main/resources/config.yml
+++ b/src/main/resources/config.yml
@@ -1,4 +1,4 @@
-Version: 2.0
+Version: 2.1
#是否只允许控制台执行插件命令
onlyCommandConsole: false
#是否只允许控制台执行插件文件命令
@@ -12,4 +12,9 @@ ignorelist:
- 'Yum'
- 'Vault'
- 'iConomy'
-- 'GroupManager'
\ No newline at end of file
+- 'GroupManager'
+- 'PermissionsEx'
+#网络调试模式
+NetworkDebug: false
+#是否允许插件主线程访问网络
+AllowPrimaryThread: false
\ No newline at end of file