I2P Address: [http://git.idk.i2p]

Skip to content
Snippets Groups Projects
Commit 68f67b7c authored by zzz's avatar zzz
Browse files

UPnP:

 (ticket #1123)
 - Add new config i2np.upnp.ignore to specify UDNs of ignored devices
 - Add display of ignored devices on /peers
parent 2b2f34b3
No related branches found
No related tags found
No related merge requests found
...@@ -8,6 +8,7 @@ import java.net.MalformedURLException; ...@@ -8,6 +8,7 @@ import java.net.MalformedURLException;
import java.net.UnknownHostException; import java.net.UnknownHostException;
import java.net.URL; import java.net.URL;
import java.util.Collections; import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
import java.util.Iterator; import java.util.Iterator;
import java.util.Map; import java.util.Map;
...@@ -78,6 +79,8 @@ class UPnP extends ControlPoint implements DeviceChangeListener, EventListener { ...@@ -78,6 +79,8 @@ class UPnP extends ControlPoint implements DeviceChangeListener, EventListener {
private Device _router; private Device _router;
private Service _service; private Service _service;
// UDN -> friendly name
private final Map<String, String> _otherUDNs;
private boolean isDisabled = false; // We disable the plugin if more than one IGD is found private boolean isDisabled = false; // We disable the plugin if more than one IGD is found
private volatile boolean _serviceLacksAPM; private volatile boolean _serviceLacksAPM;
private final Object lock = new Object(); private final Object lock = new Object();
...@@ -92,6 +95,7 @@ class UPnP extends ControlPoint implements DeviceChangeListener, EventListener { ...@@ -92,6 +95,7 @@ class UPnP extends ControlPoint implements DeviceChangeListener, EventListener {
private ForwardPortCallback forwardCallback; private ForwardPortCallback forwardCallback;
private static final String PROP_ADVANCED = "routerconsole.advanced"; private static final String PROP_ADVANCED = "routerconsole.advanced";
private static final String PROP_IGNORE = "i2np.upnp.ignore";
public UPnP(I2PAppContext context) { public UPnP(I2PAppContext context) {
super(); super();
...@@ -99,6 +103,7 @@ class UPnP extends ControlPoint implements DeviceChangeListener, EventListener { ...@@ -99,6 +103,7 @@ class UPnP extends ControlPoint implements DeviceChangeListener, EventListener {
_log = _context.logManager().getLog(UPnP.class); _log = _context.logManager().getLog(UPnP.class);
portsToForward = new HashSet<ForwardPort>(); portsToForward = new HashSet<ForwardPort>();
portsForwarded = new HashSet<ForwardPort>(); portsForwarded = new HashSet<ForwardPort>();
_otherUDNs = new HashMap<String, String>(4);
addDeviceChangeListener(this); addDeviceChangeListener(this);
} }
...@@ -178,21 +183,33 @@ class UPnP extends ControlPoint implements DeviceChangeListener, EventListener { ...@@ -178,21 +183,33 @@ class UPnP extends ControlPoint implements DeviceChangeListener, EventListener {
* DeviceChangeListener * DeviceChangeListener
*/ */
public void deviceAdded(Device dev) { public void deviceAdded(Device dev) {
String udn = dev.getUDN();
if (udn == null)
udn = "???";
String name = dev.getFriendlyName();
if (name == null)
name = "???";
synchronized (lock) { synchronized (lock) {
if(isDisabled) { if(isDisabled) {
if (_log.shouldLog(Log.WARN)) if (_log.shouldLog(Log.WARN))
_log.warn("Plugin has been disabled previously, ignoring new device."); _log.warn("Plugin has been disabled previously, ignoring " + name + " UDN: " + udn);
_otherUDNs.put(udn, name);
return; return;
} }
} }
if(!ROUTER_DEVICE.equals(dev.getDeviceType()) || !dev.isRootDevice()) { if(!ROUTER_DEVICE.equals(dev.getDeviceType()) || !dev.isRootDevice()) {
if (_log.shouldLog(Log.WARN)) if (_log.shouldLog(Log.WARN))
_log.warn("UP&P non-IGD device found, ignoring : " + dev.getFriendlyName()); _log.warn("UP&P non-IGD device found, ignoring " + name);
synchronized (lock) {
_otherUDNs.put(udn, name);
}
return; // ignore non-IGD devices return; // ignore non-IGD devices
} else if(isNATPresent()) { } else if(isNATPresent()) {
// maybe we should see if the old one went away before ignoring the new one? // maybe we should see if the old one went away before ignoring the new one?
if (_log.shouldLog(Log.WARN)) _log.logAlways(Log.WARN, "UP&P ignoring additional device " + name + " UDN: " + udn);
_log.warn("UP&P ignoring additional IGD device found: " + dev.getFriendlyName() + " UDN: " + dev.getUDN()); synchronized (lock) {
_otherUDNs.put(udn, name);
}
/********** seems a little drastic /********** seems a little drastic
isDisabled = true; isDisabled = true;
...@@ -206,11 +223,29 @@ class UPnP extends ControlPoint implements DeviceChangeListener, EventListener { ...@@ -206,11 +223,29 @@ class UPnP extends ControlPoint implements DeviceChangeListener, EventListener {
return; return;
} }
if (_log.shouldLog(Log.WARN)) boolean ignore = false;
_log.warn("UP&P IGD found : " + dev.getFriendlyName() + " UDN: " + dev.getUDN() + " lease time: " + dev.getLeaseTime()); String toIgnore = _context.getProperty(PROP_IGNORE);
if (toIgnore != null) {
String[] ignores = toIgnore.split("[,; \r\n\t]");
for (int i = 0; i < ignores.length; i++) {
if (ignores[i].equals(udn)) {
ignore = true;
_log.logAlways(Log.WARN, "Ignoring by config: " + name + " UDN: " + udn);
break;
}
}
}
synchronized(lock) { synchronized(lock) {
_router = dev; if (ignore) {
_otherUDNs.put(udn, name);
return;
} else {
_router = dev;
}
} }
if (_log.shouldLog(Log.WARN))
_log.warn("UP&P IGD found : " + name + " UDN: " + udn + " lease time: " + dev.getLeaseTime());
discoverService(); discoverService();
// We have found the device we need: stop the listener thread // We have found the device we need: stop the listener thread
...@@ -303,16 +338,21 @@ class UPnP extends ControlPoint implements DeviceChangeListener, EventListener { ...@@ -303,16 +338,21 @@ class UPnP extends ControlPoint implements DeviceChangeListener, EventListener {
* DeviceChangeListener * DeviceChangeListener
*/ */
public void deviceRemoved(Device dev ){ public void deviceRemoved(Device dev ){
String udn = dev.getUDN();
if (_log.shouldLog(Log.WARN)) if (_log.shouldLog(Log.WARN))
_log.warn("UP&P device removed : " + dev.getFriendlyName() + " UDN: " + dev.getUDN()); _log.warn("UP&P device removed : " + dev.getFriendlyName() + " UDN: " + udn);
synchronized (lock) { synchronized (lock) {
if(_router == null) return; if(_router == null) return;
if (udn != null)
_otherUDNs.remove(udn);
else
_otherUDNs.remove("???");
// I2P this wasn't working // I2P this wasn't working
//if(_router.equals(dev)) { //if(_router.equals(dev)) {
if(ROUTER_DEVICE.equals(dev.getDeviceType()) && if(ROUTER_DEVICE.equals(dev.getDeviceType()) &&
dev.isRootDevice() && dev.isRootDevice() &&
stringEquals(_router.getFriendlyName(), dev.getFriendlyName()) && stringEquals(_router.getFriendlyName(), dev.getFriendlyName()) &&
stringEquals(_router.getUDN(), dev.getUDN())) { stringEquals(_router.getUDN(), udn)) {
if (_log.shouldLog(Log.WARN)) if (_log.shouldLog(Log.WARN))
_log.warn("UP&P IGD device removed : " + dev.getFriendlyName()); _log.warn("UP&P IGD device removed : " + dev.getFriendlyName());
_router = null; _router = null;
...@@ -557,6 +597,21 @@ class UPnP extends ControlPoint implements DeviceChangeListener, EventListener { ...@@ -557,6 +597,21 @@ class UPnP extends ControlPoint implements DeviceChangeListener, EventListener {
final StringBuilder sb = new StringBuilder(); final StringBuilder sb = new StringBuilder();
sb.append("<h3><a name=\"upnp\"></a>").append(_("UPnP Status")).append("</h3>"); sb.append("<h3><a name=\"upnp\"></a>").append(_("UPnP Status")).append("</h3>");
synchronized(_otherUDNs) {
if (!_otherUDNs.isEmpty()) {
sb.append(_("Disabled UPnP Devices"));
sb.append("<ul>");
for (Map.Entry<String, String> e : _otherUDNs.entrySet()) {
String udn = e.getKey();
String name = e.getValue();
sb.append("<li>").append(name)
.append("<br>UDN: ").append(udn)
.append("</li>");
}
sb.append("</ul>");
}
}
if(isDisabled) { if(isDisabled) {
sb.append(_("UPnP has been disabled; Do you have more than one UPnP Internet Gateway Device on your LAN ?")); sb.append(_("UPnP has been disabled; Do you have more than one UPnP Internet Gateway Device on your LAN ?"));
return sb.toString(); return sb.toString();
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment