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