Changeset 33aac1b


Ignore:
Timestamp:
Nov 17, 2017 11:46:45 PM (3 years ago)
Author:
zzz <zzz@…>
Branches:
master
Children:
0ba207c
Parents:
d5cc1d8
Message:

Reseed: Add SOCKS proxy support (ticket #1130)

Files:
8 edited

Legend:

Unmodified
Added
Removed
  • apps/routerconsole/java/src/net/i2p/router/web/ConfigReseedHandler.java

    rd5cc1d8 r33aac1b  
    154154                                           Boolean.toString(disabled));
    155155        saveBoolean(Reseeder.PROP_PROXY_ENABLE, "enable");
    156         saveBoolean(Reseeder.PROP_SPROXY_ENABLE, "senable");
     156        String pmode = getJettyString("pmode");
     157        boolean senable = pmode != null && pmode.length() > 0;
     158        changes.put(Reseeder.PROP_SPROXY_ENABLE, Boolean.toString(senable));
     159        saveString(Reseeder.PROP_SPROXY_TYPE, "pmode");
    157160        if (_context.router().saveConfig(changes, removes))
    158161            addFormNotice(_t("Configuration saved successfully."));
  • apps/routerconsole/java/src/net/i2p/router/web/ConfigReseedHelper.java

    rd5cc1d8 r33aac1b  
    6161    }
    6262
     63    /** @since 0.9.33 */
     64    public String pmodeChecked(int mode) {
     65        String c =  _context.getProperty(Reseeder.PROP_SPROXY_TYPE, "HTTP");
     66        boolean disabled =  !_context.getBooleanProperty(Reseeder.PROP_SPROXY_ENABLE);
     67        if ((mode == 0 && disabled) ||
     68            (mode == 1 && !disabled && c.equals("HTTP")) ||
     69            (mode == 2 && !disabled && c.equals("SOCKS4")) ||
     70            (mode == 3 && !disabled && c.equals("SOCKS5")))
     71            return CHECKED;
     72        return "";
     73    }
     74
    6375    public String getEnable() {
    6476        return getChecked(Reseeder.PROP_PROXY_ENABLE);
     
    7082    }
    7183
     84/****
    7285    public String getSenable() {
    7386        return getChecked(Reseeder.PROP_SPROXY_ENABLE);
    7487    }
     88****/
    7589
    7690    /** @since 0.8.9 */
  • apps/routerconsole/jsp/configreseed.jsp

    rd5cc1d8 r33aac1b  
    109109</td></tr>
    110110
     111<% if (reseedHelper.shouldShowHTTPSProxy()) { %>
     112<tr><td align="right"><b><%=intl._t("Reseed Proxy Type")%>:</b></td>
     113<td><label><input type="radio" class="optbox" name="pmode" value="" <%=reseedHelper.pmodeChecked(0) %> >
     114<%=intl._t("None")%></label><br>
     115<label><input type="radio" class="optbox" name="pmode" value="HTTP" <%=reseedHelper.pmodeChecked(1) %> >
     116<%=intl._t("HTTPS")%></label><br>
     117<label><input type="radio" class="optbox" name="pmode" value="SOCKS4" <%=reseedHelper.pmodeChecked(2) %> >
     118<%=intl._t("SOCKS 4/4a")%></label><br>
     119<label><input type="radio" class="optbox" name="pmode" value="SOCKS5" <%=reseedHelper.pmodeChecked(3) %> >
     120<%=intl._t("SOCKS 5")%></label></td></tr>
     121<tr><td align="right"><b><%=intl._t("HTTPS Proxy Host")%>:</b></td>
     122<td><input name="shost" type="text" value="<jsp:getProperty name="reseedHelper" property="shost" />" ></td></tr>
     123<tr><td align="right"><b><%=intl._t("HTTPS Proxy Port")%>:</b></td>
     124<td><input name="sport" type="text" size="5" maxlength="5" value="<jsp:getProperty name="reseedHelper" property="sport" />" ></td></tr>
     125
     126<!-- not fully implemented, not necessary?
     127<tr><td align="right"><b><%=intl._t("Use HTTPS Proxy Authorization?")%></b></td>
     128<td><input type="checkbox" class="optbox" name="sauth" value="true" <jsp:getProperty name="reseedHelper" property="sauth" /> ></td></tr>
     129<tr><td align="right"><b><%=intl._t("HTTPS Proxy Username")%>:</b></td>
     130<td><input name="susername" type="text" value="<jsp:getProperty name="reseedHelper" property="susername" />" ></td></tr>
     131<tr><td align="right"><b><%=intl._t("HTTPS Proxy Password")%>:</b></td>
     132<td><input name="nofilter_spassword" type="password" value="<jsp:getProperty name="reseedHelper" property="nofilter_spassword" />" ></td></tr>
     133-->
     134<% } // shouldShowHTTPSProxy %>
     135
    111136<% if (reseedHelper.shouldShowHTTPProxy()) { %>
    112137<tr><td align="right"><label for="enableproxy"><b><%=intl._t("Enable HTTP Proxy?")%></b></label></td>
     
    125150<% } // shouldShowHTTPProxy %>
    126151
    127 <% if (reseedHelper.shouldShowHTTPSProxy()) { %>
    128 <tr><td align="right"><b><%=intl._t("Enable HTTPS Proxy?")%></b></td>
    129 <td><input type="checkbox" class="optbox" name="senable" value="true" <jsp:getProperty name="reseedHelper" property="senable" /> ></td></tr>
    130 <tr><td align="right"><b><%=intl._t("HTTPS Proxy Host")%>:</b></td>
    131 <td><input name="shost" type="text" value="<jsp:getProperty name="reseedHelper" property="shost" />" ></td></tr>
    132 <tr><td align="right"><b><%=intl._t("HTTPS Proxy Port")%>:</b></td>
    133 <td><input name="sport" type="text" size="5" maxlength="5" value="<jsp:getProperty name="reseedHelper" property="sport" />" ></td></tr>
    134 
    135 <!-- not fully implemented, not necessary?
    136 <tr><td align="right"><b><%=intl._t("Use HTTPS Proxy Authorization?")%></b></td>
    137 <td><input type="checkbox" class="optbox" name="sauth" value="true" <jsp:getProperty name="reseedHelper" property="sauth" /> ></td></tr>
    138 <tr><td align="right"><b><%=intl._t("HTTPS Proxy Username")%>:</b></td>
    139 <td><input name="susername" type="text" value="<jsp:getProperty name="reseedHelper" property="susername" />" ></td></tr>
    140 <tr><td align="right"><b><%=intl._t("HTTPS Proxy Password")%>:</b></td>
    141 <td><input name="nofilter_spassword" type="password" value="<jsp:getProperty name="reseedHelper" property="nofilter_spassword" />" ></td></tr>
    142 -->
    143 <% } // shouldShowHTTPSProxy %>
    144 
    145152 <tr>
    146153  <td class="optionsave" colspan="2">
  • core/java/src/net/i2p/util/EepGet.java

    rd5cc1d8 r33aac1b  
    17381738            return rv;
    17391739        }
     1740
     1741        /** @since 0.9.33 */
     1742        public String getUsername() { return username; }
     1743
     1744        /** @since 0.9.33 */
     1745        public String getPassword() { return password; }
    17401746    }
    17411747
  • core/java/src/net/i2p/util/SSLEepGet.java

    rd5cc1d8 r33aac1b  
    7272import net.i2p.crypto.KeyStoreUtil;
    7373import net.i2p.data.DataHelper;
     74import net.i2p.socks.SOCKS4Client;
     75import net.i2p.socks.SOCKS5Client;
    7476
    7577/**
     
    105107     *  @since 0.9.33
    106108     */
    107     public enum ProxyType { NONE, HTTP, HTTPS, INTERNAL, SOCKS4, SOCKS5 }
     109    public enum ProxyType { NONE, HTTP, HTTPS, INTERNAL, SOCKS4, SOCKS5, TRANSPARENT }
    108110
    109111
     
    245247        boolean noVerify = false;
    246248        String proxyHost = "127.0.0.1";
    247         int proxyPort = 80;
     249        int proxyPort = 0;
     250        ProxyType ptype = ProxyType.HTTP;
    248251        boolean error = false;
    249         Getopt g = new Getopt("ssleepget", args, "p:sz");
     252        Getopt g = new Getopt("ssleepget", args, "p:y:sz");
    250253        try {
    251254            int c;
     
    266269                    break;
    267270
     271                case 'y':
     272                    String y = g.getOptarg().toUpperCase(Locale.US);
     273                    if (y.equals("HTTP") || y.equals("HTTPS")) {
     274                        // already set
     275                    } else if (y.equals("SOCKS4")) {
     276                        ptype = ProxyType.SOCKS4;
     277                    } else if (y.equals("SOCKS5")) {
     278                        ptype = ProxyType.SOCKS5;
     279                    } else {
     280                        error = true;
     281                    }
     282                    break;
     283
    268284                case 's':
    269285                    saveCerts++;
     
    295311
    296312        SSLEepGet get;
    297         if (proxyHost != null)
    298             get = new SSLEepGet(I2PAppContext.getGlobalContext(), ProxyType.HTTP, proxyHost, proxyPort, saveAs, url);
    299         else
     313        if (proxyHost != null) {
     314            if (proxyPort == 0) {
     315                if (ptype == ProxyType.HTTP)
     316                    proxyPort = 8080;
     317                else
     318                    proxyPort = 1080;
     319            }
     320            get = new SSLEepGet(I2PAppContext.getGlobalContext(), ptype, proxyHost, proxyPort, saveAs, url);
     321        } else {
    300322            get = new SSLEepGet(I2PAppContext.getGlobalContext(), saveAs, url);
     323        }
    301324        if (saveCerts > 0)
    302325            get._saveCerts = saveCerts;
     
    310333   
    311334    private static void usage() {
    312         System.err.println("Usage: SSLEepGet [-psz] https://url\n" +
    313                            "  -p proxyHost[:proxyPort]    // default port 80\n" +
     335        System.err.println("Usage: SSLEepGet [-psyz] https://url\n" +
     336                           "  -p proxyHost[:proxyPort]    // default port 8080 for HTTPS and 1080 for SOCKS\n" +
     337                           "  -y HTTPS|SOCKS4|SOCKS5      // proxy type, default HTTPS if proxyHost is set\n" +
    314338                           "  -s save unknown certs\n" +
    315339                           "  -s -s save all certs\n" +
     
    668692
    669693                if (_shouldProxy) {
    670                     if (_proxyType != ProxyType.HTTP)
     694                    if (_log.shouldLog(Log.DEBUG))
     695                        _log.debug("Connecting to " + _proxyType + " proxy");
     696                    switch (_proxyType) {
     697                      case HTTP:
     698                        httpProxyConnect(host, port);
     699                        break;
     700
     701                      case SOCKS4:
     702                        socksProxyConnect(false, host, port);
     703                        break;
     704
     705                      case SOCKS5:
     706                        socksProxyConnect(true, host, port);
     707                        break;
     708
     709                      case HTTPS:
     710                      case INTERNAL:
     711                      case TRANSPARENT:
     712                      default:
    671713                        throw new IOException("Unsupported proxy type " + _proxyType);
    672                     httpProxyConnect(host, port);
     714                    }
     715
     716                    // wrap the socket in an SSLSocket
     717                    if (_sslContext != null)
     718                        _proxy = _sslContext.getSocketFactory().createSocket(_proxy, host, port, true);
     719                    else
     720                        _proxy = ((SSLSocketFactory) SSLSocketFactory.getDefault()).createSocket(_proxy, host, port, true);
     721                    if (_log.shouldLog(Log.DEBUG))
     722                        _log.debug(_proxyType + " proxy headers read completely");
    673723                } else {
    674724                    // Warning, createSocket() followed by connect(InetSocketAddress)
     
    736786    /**
    737787     *  Connect to a HTTP proxy.
     788     *  Proxy address must be in _proxyHost and _proxyPort.
    738789     *  Side effects: Sets _proxy, _proxyIn, _proxyOut,
    739790     *  and other globals via readHeaders()
    740791     *
     792     *  @param host what the proxy should connect to
     793     *  @param port what the proxy should connect to
    741794     *  @since 0.9.33
    742795     */
     
    778831        if (_responseCode == 407) {
    779832            // TODO
    780             throw new IOException("Proxy auth unsupported");
     833            throw new IOException("Authorization unsupported on HTTP Proxy");
    781834        } else if (_responseCode != 200) {
    782835            // readHeaders() will throw on most errors, but here we ensure it is 200
     
    785838        if (_redirectLocation != null)
    786839            throw new IOException("Proxy redirect not allowed");
    787         if (_log.shouldLog(Log.DEBUG))
    788             _log.debug("proxy headers read completely");
    789 
    790         // wrap the socket in an SSLSocket
    791         if (_sslContext != null)
    792             _proxy = _sslContext.getSocketFactory().createSocket(_proxy, host, port, true);
    793         else
    794             _proxy = ((SSLSocketFactory) SSLSocketFactory.getDefault()).createSocket(_proxy, host, port, true);
     840    }
     841
     842    /**
     843     *  Connect to a SOCKS proxy.
     844     *  Proxy address must be in _proxyHost and _proxyPort.
     845     *  Side effects: Sets _proxy, _proxyIn, _proxyOut,
     846     *  and other globals via readHeaders()
     847     *
     848     *  @param host what the proxy should connect to
     849     *  @param port what the proxy should connect to
     850     *  @since 0.9.33
     851     */
     852    private void socksProxyConnect(boolean isSocks5, String host, int port) throws IOException {
     853        if (_fetchHeaderTimeout > 0) {
     854            _proxy = new Socket();
     855            _proxy.setSoTimeout(_fetchHeaderTimeout);
     856            _proxy.connect(new InetSocketAddress(_proxyHost, _proxyPort), _fetchHeaderTimeout);
     857        } else {
     858            _proxy = new Socket(_proxyHost, _proxyPort);
     859        }
     860        if (_authState != null) {
     861            if (!isSocks5)
     862                throw new IOException("Authorization unsupported on SOCKS 4");
     863            SOCKS5Client.connect(_proxy, host, port, _authState.getUsername(), _authState.getPassword());
     864        } else {
     865            if (isSocks5)
     866                SOCKS5Client.connect(_proxy, host, port);
     867            else
     868                SOCKS4Client.connect(_proxy, host, port);
     869        }
     870        _proxyIn = _proxy.getInputStream();
     871        _proxyOut = _proxy.getOutputStream();
    795872    }
    796873}
  • history.txt

    rd5cc1d8 r33aac1b  
    1 2017-11-16 zzz
     12017-11-18 zzz
     2 * Reseed: Add SOCKS proxy support (ticket #1130)
     3
     42017-11-17 zzz
     5 * Addressbook: Fix adding alternates after importing an empty book (ticket #2072)
    26 * Reseed: Add HTTPS proxy support (ticket #423)
     7 * SOCKS: Move code from i2ptunnel to core, in prep for SSLEepGet use (ticket #1130)
    38
    492017-11-16 zzz
  • router/java/src/net/i2p/router/RouterVersion.java

    rd5cc1d8 r33aac1b  
    1919    public final static String ID = "Monotone";
    2020    public final static String VERSION = CoreVersion.VERSION;
    21     public final static long BUILD = 3;
     21    public final static long BUILD = 4;
    2222
    2323    /** for example "-test" */
  • router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java

    rd5cc1d8 r33aac1b  
    146146    public static final String PROP_SPROXY_PASSWORD = "router.reseedSSLProxy.password";
    147147    public static final String PROP_SPROXY_AUTH_ENABLE = "router.reseedSSLProxy.authEnable";
     148    /** @since 0.9.33 */
     149    public static final String PROP_SPROXY_TYPE = "router.reseedSSLProxyType";
    148150    /** @since 0.9 */
    149151    public static final String PROP_DISABLE = "router.reseedDisable";
     
    922924            if (ssl) {
    923925                boolean shouldProxy = _sproxyHost != null && _sproxyHost.length() > 0 && _sproxyPort > 0;
     926                SSLEepGet.ProxyType ptype = getProxyType();
    924927                SSLEepGet sslget;
    925928                if (_sslState == null) {
    926929                    if (shouldProxy)
    927                         sslget = new SSLEepGet(_context, SSLEepGet.ProxyType.HTTP, _sproxyHost, _sproxyPort,
     930                        sslget = new SSLEepGet(_context, ptype, _sproxyHost, _sproxyPort,
    928931                                               baos, url.toString());
    929932                    else
     
    933936                } else {
    934937                    if (shouldProxy)
    935                         sslget = new SSLEepGet(_context, SSLEepGet.ProxyType.HTTP, _sproxyHost, _sproxyPort,
     938                        sslget = new SSLEepGet(_context, ptype, _sproxyHost, _sproxyPort,
    936939                                               baos, url.toString(), _sslState);
    937940                    else
     
    981984            if (ssl) {
    982985                boolean shouldProxy = _sproxyHost != null && _sproxyHost.length() > 0 && _sproxyPort > 0;
     986                SSLEepGet.ProxyType ptype = getProxyType();
    983987                SSLEepGet sslget;
    984988                if (_sslState == null) {
    985989                    if (shouldProxy)
    986                         sslget = new SSLEepGet(_context, SSLEepGet.ProxyType.HTTP, _sproxyHost, _sproxyPort,
     990                        sslget = new SSLEepGet(_context, ptype, _sproxyHost, _sproxyPort,
    987991                                               out.getPath(), url.toString());
    988992                    else
     
    992996                } else {
    993997                    if (shouldProxy)
    994                         sslget = new SSLEepGet(_context, SSLEepGet.ProxyType.HTTP, _sproxyHost, _sproxyPort,
     998                        sslget = new SSLEepGet(_context, ptype, _sproxyHost, _sproxyPort,
    995999                                               out.getPath(), url.toString(), _sslState);
    9961000                    else
     
    10611065        }
    10621066
     1067        /**
     1068         *  @throws IOException if unknown, default is HTTP
     1069         *  @return non-null
     1070         *  @since 0.9.33
     1071         */
     1072        private SSLEepGet.ProxyType getProxyType() throws IOException {
     1073            String sptype = _context.getProperty(PROP_SPROXY_TYPE, "HTTP").toUpperCase(Locale.US);
     1074            try {
     1075                return SSLEepGet.ProxyType.valueOf(sptype);
     1076            } catch (IllegalArgumentException iae) {
     1077                throw new IOException("Unsupported proxy type " + sptype);
     1078            }
     1079        }
    10631080    }
    10641081
Note: See TracChangeset for help on using the changeset viewer.