Changeset ab182d08


Ignore:
Timestamp:
Feb 27, 2018 9:26:53 PM (2 years ago)
Author:
zzz <zzz@…>
Branches:
master
Children:
2c17fef
Parents:
f869b8a
Message:

UPnP: Recognize IGD2 schemas
Don't use IGD on same host
Output last error
Preliminary work for IPv6

File:
1 edited

Legend:

Unmodified
Added
Removed
  • router/java/src/net/i2p/router/transport/UPnP.java

    rf869b8a rab182d08  
    8181        private static final String WAN_IP_CONNECTION = "urn:schemas-upnp-org:service:WANIPConnection:1";
    8282        private static final String WAN_PPP_CONNECTION = "urn:schemas-upnp-org:service:WANPPPConnection:1";
     83        /** IGD 2 flavors, since 0.9.34 */
     84        private static final String ROUTER_DEVICE_2 = "urn:schemas-upnp-org:device:InternetGatewayDevice:2";
     85        private static final String WAN_DEVICE_2 = "urn:schemas-upnp-org:device:WANDevice:2";
     86        private static final String WANCON_DEVICE_2 = "urn:schemas-upnp-org:device:WANConnectionDevice:2";
     87        private static final String WAN_IP_CONNECTION_2 = "urn:schemas-upnp-org:service:WANIPConnection:2";
     88        private static final String WAN_IPV6_CONNECTION = "urn:schemas-upnp-org:service:WANIPv6FirewallControl:1";
    8389
    8490        private Device _router;
     
    102108        private static final String PROP_ADVANCED = "routerconsole.advanced";
    103109        private static final String PROP_IGNORE = "i2np.upnp.ignore";
     110        /** set to true to talk to UPnP on the same host as us, probably for testing */
     111        private static final boolean ALLOW_SAME_HOST = false;
    104112       
    105113        public UPnP(I2PAppContext context) {
     
    204212                if (name == null)
    205213                        name = "???";
    206                 boolean isIGD = ROUTER_DEVICE.equals(dev.getDeviceType()) && dev.isRootDevice();
    207                 name += isIGD ? " IGD" : (" " + dev.getDeviceType());
     214                String type = dev.getDeviceType();
     215                boolean isIGD = (ROUTER_DEVICE.equals(type) || ROUTER_DEVICE_2.equals(type)) && dev.isRootDevice();
     216                name += isIGD ? " IGD" : (' ' + type);
    208217                String ip = getIP(dev);
    209218                if (ip != null)
     
    217226                        }
    218227                }
    219                 if(!ROUTER_DEVICE.equals(dev.getDeviceType()) || !dev.isRootDevice()) {
     228                if(!isIGD) {
    220229                        if (_log.shouldLog(Log.WARN))
    221230                                _log.warn("UP&P non-IGD device found, ignoring " + name + ' ' + dev.getDeviceType());
     
    246255                        }
    247256                }
     257                Set<String> myAddresses = Addresses.getAddresses(true, false);  // yes local, no IPv6
     258                if (!ignore && !ALLOW_SAME_HOST && ip != null && myAddresses.contains(ip)) {
     259                        ignore = true;
     260                        _log.logAlways(Log.WARN, "Ignoring UPnP on same host: " + name + " UDN: " + udn);
     261                }
     262
    248263                synchronized(lock) {
    249264                        if (ignore) {
     
    291306                synchronized (lock) {
    292307                        for (Device current : _router.getDeviceList()) {
    293                                 if (!current.getDeviceType().equals(WAN_DEVICE))
     308                                String type = current.getDeviceType();
     309                                if (!(WAN_DEVICE.equals(type) || WAN_DEVICE_2.equals(type)))
    294310                                        continue;
    295311
     
    297313                                for (int i=0;i<current.getDeviceList().size();i++) {
    298314                                        Device current2 = l.getDevice(i);
    299                                         if (!current2.getDeviceType().equals(WANCON_DEVICE))
     315                                        type = current2.getDeviceType();
     316                                        if (!(WANCON_DEVICE.equals(type) || WANCON_DEVICE_2.equals(type)))
    300317                                                continue;
    301318                                       
    302                                         _service = current2.getService(WAN_IP_CONNECTION);
    303                                         if(_service == null) {
    304                                                 if (_log.shouldLog(Log.INFO))
    305                                                         _log.info(_router.getFriendlyName()+ " does not support WAN_IP_CONNECTION");
    306                                                 _service = current2.getService(WAN_PPP_CONNECTION);
    307                                                 if(_service == null)
    308                                                         _log.error(_router.getFriendlyName()+ " doesn't export WAN_PPP_CONNECTION either; we won't be able to use it!");
     319                                        _service = current2.getService(WAN_IP_CONNECTION_2);
     320                                        if (_service == null) {
     321                                                _service = current2.getService(WAN_IP_CONNECTION);
     322                                                if (_service == null) {
     323                                                        _service = current2.getService(WAN_PPP_CONNECTION);
     324                                                        if (_service == null) {
     325                                                                if (_log.shouldWarn())
     326                                                                        _log.warn(_router.getFriendlyName() + " doesn't have any recognized connection type; we won't be able to use it!");
     327                                                        }
     328                                                }
    309329                                        }
    310                                        
     330                                        if (_log.shouldWarn()) {
     331                                                Service svc2 = current2.getService(WAN_IPV6_CONNECTION);
     332                                                if (svc2 != null)
     333                                                        _log.warn(_router.getFriendlyName() + " supports WANIPv6Connection, but we don't");
     334                                        }
    311335                                        _serviceLacksAPM = false;
    312336                                        return;
     
    362386                        // I2P this wasn't working
    363387                        //if(_router.equals(dev)) {
    364                         if(ROUTER_DEVICE.equals(dev.getDeviceType()) &&
     388                        String type = dev.getDeviceType();
     389                        if ((ROUTER_DEVICE.equals(type) || ROUTER_DEVICE_2.equals(type)) &&
    365390                           dev.isRootDevice() &&
    366391                           stringEquals(_router.getFriendlyName(), dev.getFriendlyName()) &&
     
    621646                }
    622647                return rv;
     648        }
     649
     650        /**
     651         *  @since 0.9.34
     652         */
     653        private String toBoolean(String action, String arg, Service serv) {
     654                String rv = toString(action, arg, serv);
     655                return Boolean.toString("1".equals(rv));
    623656        }
    624657
     
    675708                                sb.append("<ul><li>").append(_t("Default Connection Service")).append(": ")
    676709                                  .append(toString("GetDefaultConnectionService", "NewDefaultConnectionService", serv));
    677                         }else if(WAN_IP_CONNECTION.equals(type)){
     710                        } else if(WAN_IP_CONNECTION.equals(type) || WAN_IP_CONNECTION_2.equals(type)) {
    678711                                sb.append(_t("WAN IP Connection"));
    679712                                sb.append("<ul><li>").append(_t("Status")).append(": ")
     
    681714                                sb.append("<li>").append(_t("Uptime")).append(": ")
    682715                                   .append(toTime("GetStatusInfo", "NewUptime", serv));
     716                                String error = toString("GetStatusInfo", "NewLastConnectionError", serv);
     717                                if (error != null && error.length() > 0 && !error.equals("ERROR_NONE"))
     718                                        sb.append("<li>").append("Last Error").append(": ").append(error);
    683719                                sb.append("<li>").append(_t("Type")).append(": ")
    684720                                  .append(toString("GetConnectionTypeInfo", "NewConnectionType", serv));
    685721                                sb.append("<li>").append(_t("External IP")).append(": ")
    686722                                  .append(toString("GetExternalIPAddress", "NewExternalIPAddress", serv));
     723                        } else if(WAN_IPV6_CONNECTION.equals(type)) {
     724                                sb.append("WAN IPv6 Connection");
     725                                sb.append("<ul><li>").append("Firewall Enabled").append(": ")
     726                                  .append(toBoolean("GetFirewallStatus", "FirewallEnabled", serv));
     727                                sb.append("<li>").append("Pinhole Allowed").append(": ")
     728                                   .append(toBoolean("GetFirewallStatus", "InboundPinholeAllowed", serv));
    687729                        }else if("urn:schemas-upnp-org:service:WANEthernetLinkConfig:1".equals(type)){
    688730                                sb.append(_t("WAN Ethernet Link Configuration"));
     
    758800                }
    759801               
    760                 listSubDev(null, _router, sb);
     802                Device router;
     803                synchronized(lock) {
     804                        router = _router;
     805                }
     806                if (router != null)
     807                        listSubDev(null, router, sb);
    761808                String addr = getNATAddress();
    762809                sb.append("<p>");
Note: See TracChangeset for help on using the changeset viewer.