Changeset 5d3984e


Ignore:
Timestamp:
Sep 26, 2012 8:00:59 PM (9 years ago)
Author:
zzz <zzz@…>
Branches:
master
Children:
20e463e
Parents:
941aea80
Message:
  • Addresses: Reject numeric IPs of the form n, n.n, and n.n.n
  • Console, i2ptunnel: More validation of address and port in forms
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • apps/i2ptunnel/java/src/net/i2p/i2ptunnel/web/IndexBean.java

    r941aea80 r5d3984e  
    3333import net.i2p.i2ptunnel.TunnelController;
    3434import net.i2p.i2ptunnel.TunnelControllerGroup;
     35import net.i2p.util.Addresses;
    3536import net.i2p.util.ConcurrentHashSet;
    3637import net.i2p.util.FileUtil;
     
    437438    }
    438439   
     440    /**
     441     *  No validation
     442     */
    439443    public String getClientPort(int tunnel) {
    440444        TunnelController tun = getController(tunnel);
     
    443447        else
    444448            return "";
     449    }
     450   
     451    /**
     452     *  Returns error message if blank or invalid
     453     *  @since 0.9.3
     454     */
     455    public String getClientPort2(int tunnel) {
     456        TunnelController tun = getController(tunnel);
     457        if (tun != null && tun.getListenPort() != null) {
     458            String port = tun.getListenPort();
     459            if (port.length() == 0)
     460                return "<font color=\"red\">" + _("Port not set") + "</font>";
     461            if (Addresses.getPort(port) == 0)
     462                return "<font color=\"red\">" + _("Invalid port") + ' ' + port + "</font>";
     463            return port;
     464        }
     465        return "<font color=\"red\">" + _("Port not set") + "</font>";
    445466    }
    446467   
     
    552573                host = tun.getTargetHost();
    553574            String port = tun.getTargetPort();
    554             if (host == null)
     575            if (host == null || host.length() == 0)
    555576                host = "<font color=\"red\">" + _("Host not set") + "</font>";
     577            else if (Addresses.getIP(host) == null)
     578                host = "<font color=\"red\">" + _("Invalid address") + ' ' + host + "</font>";
    556579            else if (host.indexOf(':') >= 0)
    557580                host = '[' + host + ']';
    558             if (port == null)
     581            if (port == null || port.length() == 0)
    559582                port = "<font color=\"red\">" + _("Port not set") + "</font>";
     583            else if (Addresses.getPort(port) == 0)
     584                port = "<font color=\"red\">" + _("Invalid port") + ' ' + port + "</font>";
    560585            return host + ':' + port;
    561586       }  else
  • apps/i2ptunnel/jsp/index.jsp

    r941aea80 r5d3984e  
    223223            <span class="text">
    224224         <%
    225                String cPort= indexBean.getClientPort(curClient);
    226                if ("".equals(cPort)) {
    227                    out.write("<font color=\"red\">");
    228                    out.write(intl._("Port not set"));
    229                    out.write("</font>");
    230                } else {
    231                    out.write(cPort);
    232                }
     225               String cPort= indexBean.getClientPort2(curClient);
     226               out.write(cPort);
    233227          %>
    234228            </span>
  • apps/routerconsole/java/src/net/i2p/router/web/ConfigNetHandler.java

    r941aea80 r5d3984e  
    11package net.i2p.router.web;
    22
    3 import java.net.InetAddress;
    4 import java.net.UnknownHostException;
    53import java.util.ArrayList;
    64import java.util.HashMap;
     
    1412import net.i2p.router.transport.udp.UDPTransport;
    1513import net.i2p.router.web.ConfigServiceHandler;
     14import net.i2p.util.Addresses;
    1615
    1716/**
     
    144143    private void saveChanges() {
    145144        boolean restartRequired = false;
     145        boolean error = false;
    146146        List<String> removes = new ArrayList();
    147147       
     
    167167                    if (valid) {
    168168                        changes.put(UDPTransport.PROP_EXTERNAL_HOST, uhost);
     169                    } else {
     170                        error = true;
    169171                    }
    170172                } else {
     
    196198                    if (valid) {
    197199                        changes.put(ConfigNetHelper.PROP_I2NP_NTCP_HOSTNAME, _ntcpHostname);
    198                         addFormNotice(_("Updating inbound TCP address to") + " " + _ntcpHostname);
     200                        addFormNotice(_("Updating TCP address to {0}", _ntcpHostname));
     201                    } else {
     202                        error = true;
    199203                    }
    200204                } else {
     
    213217            if (oldAutoPort != _ntcpAutoPort || ! oldNPort.equals(_ntcpPort)) {
    214218                if (_ntcpPort.length() > 0 && !_ntcpAutoPort) {
    215                     changes.put(ConfigNetHelper.PROP_I2NP_NTCP_PORT, _ntcpPort);
    216                     addFormNotice(_("Updating inbound TCP port to") + " " + _ntcpPort);
     219                    if (Addresses.getPort(_ntcpPort) != 0) {
     220                        changes.put(ConfigNetHelper.PROP_I2NP_NTCP_PORT, _ntcpPort);
     221                        addFormNotice(_("Updating TCP port to {0}", _ntcpPort));
     222                    } else {
     223                        addFormError(_("Invalid port") + ": " + _ntcpPort);
     224                        error = true;
     225                    }
    217226                } else {
    218227                    removes.add(ConfigNetHelper.PROP_I2NP_NTCP_PORT);
     
    227236                String oldPort = _context.getProperty(UDPTransport.PROP_INTERNAL_PORT, "unset");
    228237                if (!oldPort.equals(_udpPort)) {
    229                     changes.put(UDPTransport.PROP_INTERNAL_PORT, _udpPort);
    230                     changes.put(UDPTransport.PROP_EXTERNAL_PORT, _udpPort);
    231                     addFormNotice(_("Updating UDP port from") + " " + oldPort + " " + _("to") + " " + _udpPort);
    232                     restartRequired = true;
     238                    if (Addresses.getPort(_udpPort) != 0) {
     239                        changes.put(UDPTransport.PROP_INTERNAL_PORT, _udpPort);
     240                        changes.put(UDPTransport.PROP_EXTERNAL_PORT, _udpPort);
     241                        addFormNotice(_("Updating UDP port to {0}", _udpPort));
     242                        restartRequired = true;
     243                    } else {
     244                        addFormError(_("Invalid port") + ": " + _udpPort);
     245                        error = true;
     246                    }
    233247                }
    234248            }
     
    303317            _context.bandwidthLimiter().reinitialize();
    304318       
    305         if (switchRequired) {
    306             hiddenSwitch();
    307         } else if (restartRequired) {
    308             //if (_context.hasWrapper()) {
     319        if (saved && !error) {
     320            if (switchRequired) {
     321                hiddenSwitch();
     322            } else if (restartRequired) {
     323              //if (_context.hasWrapper()) {
    309324                // Wow this dumps all conns immediately and really isn't nice
    310325                addFormNotice("Performing a soft restart");
     
    321336                //_context.router().rebuildRouterInfo();
    322337                //addFormNotice("Router Info rebuilt");
    323             //} else {
     338              //} else {
    324339                // There's a few changes that don't really require restart (e.g. enabling inbound TCP)
    325340                // But it would be hard to get right, so just do a restart.
    326341                //addFormError(_("Gracefully restarting I2P to change published router address"));
    327342                //_context.router().shutdownGracefully(Router.EXIT_GRACEFUL_RESTART);
    328             //}
     343              //}
     344            }
    329345        }
    330346    }
     
    338354        if (addr == null || addr.length() <= 0)
    339355            return false;
    340         try {
    341             InetAddress ia = InetAddress.getByName(addr);
    342             byte[] iab = ia.getAddress();
    343             boolean rv = TransportImpl.isPubliclyRoutable(iab);
    344             if (!rv)
    345                 addFormError(_("The hostname or IP {0} is not publicly routable", addr));
    346             return rv;
    347         } catch (UnknownHostException uhe) {
    348             addFormError(_("The hostname or IP {0} is invalid", addr) + ": " + uhe);
     356        byte[] iab = Addresses.getIP(addr);
     357        if (iab == null) {
     358            addFormError(_("Invalid address") + ": " + addr);
    349359            return false;
    350360        }
     361        boolean rv = TransportImpl.isPubliclyRoutable(iab);
     362        if (!rv)
     363            addFormError(_("The hostname or IP {0} is not publicly routable", addr));
     364        return rv;
    351365    }
    352366
  • core/java/src/net/i2p/util/Addresses.java

    r941aea80 r5d3984e  
    155155        }
    156156    }
     157   
     158    /**
     159     *  Convenience method to convert and validate a port String
     160     *  without throwing an exception.
     161     *  Does not trim.
     162     *
     163     *  @return 1-65535 or 0 if invalid
     164     *  @since 0.9.3
     165     */
     166    public static int getPort(String port) {
     167        int rv = 0;
     168        if (port != null) {
     169            try {
     170                int iport = Integer.parseInt(port);
     171                if (iport > 0 && iport <= 65535)
     172                    rv = iport;
     173            } catch (NumberFormatException nfe) {}
     174        }
     175        return rv;
     176    }
    157177
    158178    /**
     
    185205     *  Will resolve but not cache DNS host names.
    186206     *
     207     *  Unlike InetAddress.getByName(), we do NOT allow numeric IPs
     208     *  of the form d.d.d, d.d, or d, as these are almost certainly mistakes.
     209     *
    187210     *  @param host DNS or IPv4 or IPv6 host name; if null returns null
    188211     *  @return IP or null
     
    198221        if (rv == null) {
    199222            try {
     223                boolean isIPv4 = host.replaceAll("[0-9\\.]", "").length() == 0;
     224                if (isIPv4 && host.replaceAll("[0-9]", "").length() != 3)
     225                    return null;
    200226                rv = InetAddress.getByName(host).getAddress();
    201                 if (host.replaceAll("[0-9\\.]", "").length() == 0 ||
     227                if (isIPv4 ||
    202228                    host.replaceAll("[0-9a-fA-F:]", "").length() == 0) {
    203229                    synchronized (_IPAddress) {
Note: See TracChangeset for help on using the changeset viewer.