mirror of
https://e.coding.net/circlecloud/Yum.git
synced 2024-11-22 14:28:46 +00:00
fix(NetworkManager.java): 修复网络代理检测部分...
1.配置文件添加新选项 2.调整代理注入时间 3.更新版本号
This commit is contained in:
parent
e3126b62ed
commit
d46dfdf13d
2
pom.xml
2
pom.xml
@ -3,7 +3,7 @@
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<groupId>pw.yumc</groupId>
|
||||
<artifactId>Yum</artifactId>
|
||||
<version>2.0.3</version>
|
||||
<version>2.1</version>
|
||||
<name>Yum</name>
|
||||
<description>Minecraft 服务器插件管理系统</description>
|
||||
<build>
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
@ -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.<RuntimeException> throwException0(exception);
|
||||
}
|
||||
|
||||
public void register() {
|
||||
main.getLogger().info("注入网络代理 将托管服务器网络!");
|
||||
ProxySelector.setDefault(new YumProxySelector(ProxySelector.getDefault()));
|
||||
@SuppressWarnings("unchecked")
|
||||
private static <T extends Throwable> 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<ClassLoader, Plugin> 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<Proxy> select(final URI uri) {
|
||||
if (debug || Bukkit.isPrimaryThread()) {
|
||||
try {
|
||||
final Plugin plugin = this.getRequestingPlugin();
|
||||
final String urlinfo = uri.getHost() + ":" + uri.getPort() + "/" + uri.getPath();
|
||||
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) {
|
||||
}
|
||||
|
@ -1,4 +1,4 @@
|
||||
Version: 2.0
|
||||
Version: 2.1
|
||||
#是否只允许控制台执行插件命令
|
||||
onlyCommandConsole: false
|
||||
#是否只允许控制台执行插件文件命令
|
||||
@ -13,3 +13,8 @@ ignorelist:
|
||||
- 'Vault'
|
||||
- 'iConomy'
|
||||
- 'GroupManager'
|
||||
- 'PermissionsEx'
|
||||
#网络调试模式
|
||||
NetworkDebug: false
|
||||
#是否允许插件主线程访问网络
|
||||
AllowPrimaryThread: false
|
Loading…
Reference in New Issue
Block a user