Changeset 7cb5dab


Ignore:
Timestamp:
Jan 30, 2017 12:33:43 AM (4 years ago)
Author:
zzz <zzz@…>
Branches:
master
Children:
890ad25
Parents:
1cf6030
Message:

i2ptunnel: Add support for outproxy plugin to CONNECT proxy (tickets #1364, #1895)
Add support for ports to CONNECT proxy

Location:
apps/i2ptunnel/java/src/net/i2p/i2ptunnel
Files:
7 edited

Legend:

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

    r1cf6030 r7cb5dab  
    1515import net.i2p.I2PAppContext;
    1616import net.i2p.I2PException;
     17import net.i2p.app.ClientApp;
     18import net.i2p.app.ClientAppManager;
     19import net.i2p.app.Outproxy;
    1720import net.i2p.client.streaming.I2PSocket;
    1821import net.i2p.client.streaming.I2PSocketOptions;
     
    3538 *   )
    3639 *
    37  *   (port and protocol are ignored for i2p destinations)
     40 *   (protocol is ignored for i2p destinations)
    3841 *   CONNECT host
    3942 *   CONNECT host protocol
     
    148151        boolean usingWWWProxy = false;
    149152        String currentProxy = null;
     153        // local outproxy plugin
     154        boolean usingInternalOutproxy = false;
     155        Outproxy outproxy = null;
    150156        long requestId = __requestId.incrementAndGet();
    151157        try {
     
    155161            StringBuilder newRequest = new StringBuilder();
    156162            String authorization = null;
     163            int remotePort = 443;
    157164            while (true) {
    158165                // Use this rather than BufferedReader because we can't have readahead,
     
    173180
    174181                    pos = request.indexOf(':');
    175                     if (pos == -1)
     182                    if (pos == -1) {
    176183                       pos = request.indexOf(' ');
     184                    } else {
     185                       int spos = request.indexOf(' ');
     186                       if (spos > 0) {
     187                           try {
     188                               remotePort = Integer.parseInt(request.substring(pos + 1, spos));
     189                           } catch (NumberFormatException nfe) {
     190                               break;
     191                           } catch (IndexOutOfBoundsException ioobe) {
     192                               break;
     193                           }
     194                       }
     195                    }
    177196                    if (pos == -1) {
    178197                        host = request;
     
    186205                        // Destination gets the host name
    187206                        destination = host;
    188                     } else if (host.indexOf('.') != -1) {
    189                         // The request must be forwarded to a outproxy
    190                         currentProxy = selectProxy();
    191                         if (currentProxy == null) {
    192                             if (_log.shouldLog(Log.WARN))
    193                                 _log.warn(getPrefix(requestId) + "Host wants to be outproxied, but we dont have any!");
    194                             writeErrorMessage(ERR_NO_OUTPROXY, out);
    195                             s.close();
    196                             return;
     207                    } else if (host.contains(".") || host.startsWith("[")) {
     208                        if (Boolean.parseBoolean(getTunnel().getClientOptions().getProperty(PROP_USE_OUTPROXY_PLUGIN, "true"))) {
     209                            ClientAppManager mgr = _context.clientAppManager();
     210                            if (mgr != null) {
     211                                ClientApp op = mgr.getRegisteredApp(Outproxy.NAME);
     212                                if (op != null) {
     213                                    outproxy = (Outproxy) op;
     214                                    usingInternalOutproxy = true;
     215                                    if (host.startsWith("[")) {
     216                                        host = host.substring(1);
     217                                        if (host.endsWith("]"))
     218                                            host = host.substring(0, host.length() - 1);
     219                                    }
     220                                }
     221                            }
    197222                        }
    198                         destination = currentProxy;
    199                         usingWWWProxy = true;
    200                         newRequest.append("CONNECT ").append(host).append(restofline).append("\r\n"); // HTTP spec
     223                        if (!usingInternalOutproxy) {
     224                            // The request must be forwarded to a outproxy
     225                            currentProxy = selectProxy();
     226                            if (currentProxy == null) {
     227                                if (_log.shouldLog(Log.WARN))
     228                                    _log.warn(getPrefix(requestId) + "Host wants to be outproxied, but we dont have any!");
     229                                writeErrorMessage(ERR_NO_OUTPROXY, out);
     230                                s.close();
     231                                return;
     232                            }
     233                            destination = currentProxy;
     234                            usingWWWProxy = true;
     235                            newRequest.append("CONNECT ").append(host).append(restofline).append("\r\n"); // HTTP spec
     236                         }
    201237                    } else if (host.toLowerCase(Locale.US).equals("localhost")) {
    202238                        writeErrorMessage(ERR_LOCALHOST, out);
     
    209245
    210246                    if (_log.shouldLog(Log.DEBUG)) {
    211                         _log.debug(getPrefix(requestId) + "METHOD:" + method + ":");
    212                         _log.debug(getPrefix(requestId) + "HOST  :" + host + ":");
    213                         _log.debug(getPrefix(requestId) + "REST  :" + restofline + ":");
    214                         _log.debug(getPrefix(requestId) + "DEST  :" + destination + ":");
     247                        _log.debug(getPrefix(requestId) + "METHOD:" + method + ":\n" +
     248                                   "HOST  :" + host + ":\n" +
     249                                   "PORT  :" + remotePort + ":\n" +
     250                                   "REST  :" + restofline + ":\n" +
     251                                   "DEST  :" + destination + ":\n" +
     252                                   "www proxy? " + usingWWWProxy + " internal proxy? " + usingInternalOutproxy);
    215253                    }
    216254                } else if (line.toLowerCase(Locale.US).startsWith("proxy-authorization: ")) {
     
    251289            }
    252290
    253             if (destination == null || method == null || !"CONNECT".equals(method.toUpperCase(Locale.US))) {
     291            if (method == null || !"CONNECT".equals(method.toUpperCase(Locale.US))) {
     292                writeErrorMessage(ERR_BAD_PROTOCOL, out);
     293                s.close();
     294                return;
     295            }
     296           
     297            // no destination, going to outproxy plugin
     298            if (usingInternalOutproxy) {
     299                Socket outSocket = outproxy.connect(host, remotePort);
     300                OnTimeout onTimeout = new OnTimeout(s, s.getOutputStream(), targetRequest, usingWWWProxy, currentProxy, requestId);
     301                byte[] response = SUCCESS_RESPONSE.getBytes("UTF-8");
     302                Thread t = new I2PTunnelOutproxyRunner(s, outSocket, sockLock, null, response, onTimeout);
     303                // we are called from an unlimited thread pool, so run inline
     304                t.run();
     305                return;
     306            }
     307
     308            if (destination == null) {
    254309                writeErrorMessage(ERR_BAD_PROTOCOL, out);
    255310                s.close();
     
    283338            }
    284339
    285             I2PSocket i2ps = createI2PSocket(clientDest, getDefaultOptions());
     340            I2PSocketOptions sktOpts = getDefaultOptions();
     341            if (!usingWWWProxy && remotePort > 0)
     342                sktOpts.setPort(remotePort);
     343            I2PSocket i2ps = createI2PSocket(clientDest, sktOpts);
    286344            byte[] data = null;
    287345            byte[] response = null;
  • apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java

    r1cf6030 r7cb5dab  
    357357    public static final String PROP_JUMP_SERVERS = "i2ptunnel.httpclient.jumpServers";
    358358    public static final String PROP_DISABLE_HELPER = "i2ptunnel.httpclient.disableAddressHelper";
    359     /** @since 0.9.11 */
    360     public static final String PROP_USE_OUTPROXY_PLUGIN = "i2ptunnel.useLocalOutproxy";
    361359    /** @since 0.9.11 */
    362360    public static final String PROP_SSL_OUTPROXIES = "i2ptunnel.httpclient.SSLOutproxies";
  • apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClientBase.java

    r1cf6030 r7cb5dab  
    6060    private static final long MAX_NONCE_AGE = 60*60*1000L;
    6161    private static final int MAX_NONCE_COUNT = 1024;
     62    /** @since 0.9.11, moved to Base in 0.9.29 */
     63    public static final String PROP_USE_OUTPROXY_PLUGIN = "i2ptunnel.useLocalOutproxy";
    6264
    6365    private static final String ERR_AUTH1 =
  • apps/i2ptunnel/java/src/net/i2p/i2ptunnel/socks/SOCKSServer.java

    r1cf6030 r7cb5dab  
    1515import net.i2p.app.Outproxy;
    1616import net.i2p.client.streaming.I2PSocket;
    17 import net.i2p.i2ptunnel.I2PTunnelHTTPClient;
     17import net.i2p.i2ptunnel.I2PTunnelHTTPClientBase;
    1818import net.i2p.util.Log;
    1919
     
    9090     */
    9191    private boolean shouldUseOutproxyPlugin() {
    92         return Boolean.parseBoolean(props.getProperty(I2PTunnelHTTPClient.PROP_USE_OUTPROXY_PLUGIN, "true"));
     92        return Boolean.parseBoolean(props.getProperty(I2PTunnelHTTPClientBase.PROP_USE_OUTPROXY_PLUGIN, "true"));
    9393    }
    9494
  • apps/i2ptunnel/java/src/net/i2p/i2ptunnel/ui/GeneralHelper.java

    r1cf6030 r7cb5dab  
    580580     */
    581581    public boolean getUseOutproxyPlugin(int tunnel) {
    582         return getBooleanProperty(tunnel, I2PTunnelHTTPClient.PROP_USE_OUTPROXY_PLUGIN, true);
     582        return getBooleanProperty(tunnel, I2PTunnelHTTPClientBase.PROP_USE_OUTPROXY_PLUGIN, true);
    583583    }
    584584
  • apps/i2ptunnel/java/src/net/i2p/i2ptunnel/ui/TunnelConfig.java

    r1cf6030 r7cb5dab  
    410410    public void setUseOutproxyPlugin(boolean val) {
    411411        if (val)
    412             _booleanOptions.add(I2PTunnelHTTPClient.PROP_USE_OUTPROXY_PLUGIN);
    413         else
    414             _booleanOptions.remove(I2PTunnelHTTPClient.PROP_USE_OUTPROXY_PLUGIN);
     412            _booleanOptions.add(I2PTunnelHTTPClientBase.PROP_USE_OUTPROXY_PLUGIN);
     413        else
     414            _booleanOptions.remove(I2PTunnelHTTPClientBase.PROP_USE_OUTPROXY_PLUGIN);
    415415    }
    416416   
     
    696696    private static final String _booleanProxyOpts[] = {
    697697        I2PTunnelHTTPClientBase.PROP_OUTPROXY_AUTH,
    698         I2PTunnelHTTPClient.PROP_USE_OUTPROXY_PLUGIN,
     698        I2PTunnelHTTPClientBase.PROP_USE_OUTPROXY_PLUGIN,
    699699        I2PTunnelHTTPClient.PROP_USER_AGENT,
    700700        I2PTunnelHTTPClient.PROP_REFERER,
  • apps/i2ptunnel/java/src/net/i2p/i2ptunnel/web/IndexBean.java

    r1cf6030 r7cb5dab  
    500500            if (TunnelController.TYPE_HTTP_CLIENT.equals(tun.getType())) {
    501501                Properties opts = tun.getClientOptionProps();
    502                 if (Boolean.parseBoolean(opts.getProperty(I2PTunnelHTTPClient.PROP_USE_OUTPROXY_PLUGIN, "true"))) {
     502                if (Boolean.parseBoolean(opts.getProperty(I2PTunnelHTTPClientBase.PROP_USE_OUTPROXY_PLUGIN, "true"))) {
    503503                    ClientAppManager mgr = _context.clientAppManager();
    504504                    if (mgr != null)
Note: See TracChangeset for help on using the changeset viewer.