Changeset 33aac1b for core


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)

Location:
core/java/src/net/i2p/util
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • 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}
Note: See TracChangeset for help on using the changeset viewer.