From 45d66e6a83319a95d84b9715a08da08799f4ea6d Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Wed, 22 Jan 2020 20:13:40 -0600 Subject: [PATCH] UPnP Port Forwarding Service --- pom.xml | 10 ++++ .../net/minecraft/server/DedicatedServer.java | 25 ++++++++++ .../net/minecraft/server/MinecraftServer.java | 11 +++++ .../java/net/pl3x/purpur/PurpurConfig.java | 5 ++ .../net/pl3x/purpur/gui/info/JInfoPanel.java | 3 ++ .../pl3x/purpur/gui/info/UPnPComponent.java | 47 +++++++++++++++++++ 6 files changed, 101 insertions(+) create mode 100644 src/main/java/net/pl3x/purpur/gui/info/UPnPComponent.java diff --git a/pom.xml b/pom.xml index e6fc4d014e..02fe29cb6c 100644 --- a/pom.xml +++ b/pom.xml @@ -94,6 +94,12 @@ 1.1.1 compile + + com.dosse.upnp + UPnP + 1.0 + compile + org.xerial sqlite-jdbc @@ -132,6 +138,10 @@ spigotmc-public https://hub.spigotmc.org/nexus/content/groups/public/ + + pl3x + https://repo.pl3x.net/ + diff --git a/src/main/java/net/minecraft/server/DedicatedServer.java b/src/main/java/net/minecraft/server/DedicatedServer.java index 61ccb6079e..a85df1ff49 100644 --- a/src/main/java/net/minecraft/server/DedicatedServer.java +++ b/src/main/java/net/minecraft/server/DedicatedServer.java @@ -238,6 +238,31 @@ public class DedicatedServer extends MinecraftServer implements IMinecraftServer return false; } + // Purpur start + if (net.pl3x.purpur.PurpurConfig.useUPnP) { + LOGGER.info("[UPnP] Attempting to start UPnP port forwarding service..."); + com.dosse.upnp.UPnP.NAME = "Purpur UPnP"; + if (com.dosse.upnp.UPnP.isUPnPAvailable()) { + if (com.dosse.upnp.UPnP.isMappedTCP(getPort())) { + upnp = false; + LOGGER.info("[UPnP] Port " + getPort() + " is already open"); + } else if (com.dosse.upnp.UPnP.openPortTCP(getPort())) { + upnp = true; + LOGGER.info("[UPnP] Successfully opened port " + getPort()); + } else { + upnp = false; + LOGGER.info("[UPnP] Failed to open port " + getPort()); + } + if (upnp) { + LOGGER.info("[UPnP] " + com.dosse.upnp.UPnP.getExternalIP() + ":" + getPort()); + } + } else { + upnp = false; + LOGGER.error("[UPnP] Service is unavailable"); + } + } + // Purpur end + // CraftBukkit start // this.a((PlayerList) (new DedicatedPlayerList(this))); // Spigot - moved up server.loadPlugins(); diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java index e11b94e154..3cd0c48e81 100644 --- a/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/src/main/java/net/minecraft/server/MinecraftServer.java @@ -181,6 +181,7 @@ public abstract class MinecraftServer extends IAsyncTaskHandlerReentrant { ramGraph.update(); ramDetails.update(); + upnpComponent.repaint(); }); timer.start(); } diff --git a/src/main/java/net/pl3x/purpur/gui/info/UPnPComponent.java b/src/main/java/net/pl3x/purpur/gui/info/UPnPComponent.java new file mode 100644 index 0000000000..b0465d3608 --- /dev/null +++ b/src/main/java/net/pl3x/purpur/gui/info/UPnPComponent.java @@ -0,0 +1,47 @@ +package net.pl3x.purpur.gui.info; + +import net.minecraft.server.MinecraftServer; +import net.pl3x.purpur.PurpurConfig; + +import javax.swing.JTextPane; +import javax.swing.border.EmptyBorder; +import java.awt.Color; +import java.awt.Dimension; +import java.awt.Graphics; + +public class UPnPComponent extends JTextPane { + private final MinecraftServer server; + + public UPnPComponent(MinecraftServer server) { + this.server = server; + setBorder(new EmptyBorder(0, 30, 0, 10)); + setEditable(false); + setText("UPnP Status"); + setOpaque(false); + setHighlighter(null); + } + + @Override + public Dimension getPreferredSize() { + return new Dimension(350, 20); + } + + @Override + public void paint(Graphics graphics) { + super.paint(graphics); + graphics.setColor(server.isUPnPEnabled() ? Color.GREEN : Color.RED); + graphics.fillOval(10, 0, 15, 15); + setToolTipText(getTooltip()); + } + + private String getTooltip() { + if (!PurpurConfig.useUPnP) { + return "UPnP Disabled"; + } + if (server.isUPnPEnabled()) { + return "UPnP Enabled"; + } else { + return "UPnP Unavailable"; + } + } +} -- 2.24.0