Changeset cdab6f8b


Ignore:
Timestamp:
Aug 12, 2016 4:41:42 PM (4 years ago)
Author:
zzz <zzz@…>
Branches:
master
Children:
0d46c06
Parents:
b21b953
Message:

i2ptunnel: Add outproxy plugin support to SOCKS (ticket #1824)
Make some classes package private
Move some fields to SocksServer? superclass

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

Legend:

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

    rb21b953 rcdab6f8b  
    4848        try {
    4949            //_log.error("SOCKS IRC Tunnel Start");
    50             SOCKSServer serv = SOCKSServerFactory.createSOCKSServer(s, getTunnel().getClientOptions());
     50            SOCKSServer serv = SOCKSServerFactory.createSOCKSServer(_context, s, getTunnel().getClientOptions());
    5151            Socket clientSock = serv.getClientSocket();
    5252            I2PSocket destSock = serv.getDestinationI2PSocket(this);
  • apps/i2ptunnel/java/src/net/i2p/i2ptunnel/socks/I2PSOCKSTunnel.java

    rb21b953 rcdab6f8b  
    4949    protected void clientConnectionRun(Socket s) {
    5050        try {
    51             SOCKSServer serv = SOCKSServerFactory.createSOCKSServer(s, getTunnel().getClientOptions());
     51            SOCKSServer serv = SOCKSServerFactory.createSOCKSServer(_context, s, getTunnel().getClientOptions());
    5252            Socket clientSock = serv.getClientSocket();
    5353            I2PSocket destSock = serv.getDestinationI2PSocket(this);
  • apps/i2ptunnel/java/src/net/i2p/i2ptunnel/socks/SOCKS4aServer.java

    rb21b953 rcdab6f8b  
    2020import net.i2p.I2PAppContext;
    2121import net.i2p.I2PException;
     22import net.i2p.app.ClientApp;
     23import net.i2p.app.ClientAppManager;
     24import net.i2p.app.Outproxy;
    2225import net.i2p.client.streaming.I2PSocket;
    2326import net.i2p.client.streaming.I2PSocketOptions;
     
    3336 * @author zzz modded from SOCKS5Server
    3437 */
    35 public class SOCKS4aServer extends SOCKSServer {
    36     private final Log _log;
    37 
    38     private final Socket clientSock;
     38class SOCKS4aServer extends SOCKSServer {
     39
    3940    private boolean setupCompleted;
    4041
     
    5051     * @param props non-null
    5152     */
    52     public SOCKS4aServer(Socket clientSock, Properties props) {
    53         this.clientSock = clientSock;
    54         this.props = props;
    55         _log = I2PAppContext.getGlobalContext().logManager().getLog(SOCKS4aServer.class);
     53    public SOCKS4aServer(I2PAppContext ctx, Socket clientSock, Properties props) {
     54        super(ctx, clientSock, props);
    5655    }
    5756
    5857    public Socket getClientSocket() throws SOCKSException {
    5958        setupServer();
    60 
    6159        return clientSock;
    6260    }
     
    212210
    213211        try {
    214             if (connHostName.toLowerCase(Locale.US).endsWith(".i2p") ||
    215                 connHostName.toLowerCase(Locale.US).endsWith(".onion")) {
    216                 // Let's not do a new Dest for every request, huh?
    217                 //I2PSocketManager sm = I2PSocketManagerFactory.createManager();
    218                 //destSock = sm.connect(I2PTunnel.destFromName(connHostName), null);
    219                 Destination dest = I2PAppContext.getGlobalContext().namingService().lookup(connHostName);
     212            if (connHostName.toLowerCase(Locale.US).endsWith(".i2p")) {
     213                Destination dest = _context.namingService().lookup(connHostName);
    220214                if (dest == null) {
    221215                    try {
     
    237231                } catch (IOException ioe) {}
    238232                throw new SOCKSException(err);
     233          /****
    239234            } else if (connPort == 80) {
    240235                // rewrite GET line to include hostname??? or add Host: line???
     
    247242                } catch (IOException ioe) {}
    248243                throw new SOCKSException(err);
     244           ****/
    249245            } else {
    250                 List<String> proxies = t.getProxies(connPort);
    251                 if (proxies == null || proxies.isEmpty()) {
    252                     String err = "No outproxy configured for port " + connPort + " and no default configured either - host: " + connHostName;
    253                     _log.error(err);
     246                Outproxy outproxy = getOutproxyPlugin();
     247                if (outproxy != null) {
    254248                    try {
    255                         sendRequestReply(Reply.CONNECTION_REFUSED, InetAddress.getByName("127.0.0.1"), 0, out);
    256                     } catch (IOException ioe) {}
    257                     throw new SOCKSException(err);
     249                        destSock = new SocketWrapper(outproxy.connect(connHostName, connPort));
     250                    } catch (IOException ioe) {
     251                        try {
     252                            sendRequestReply(Reply.CONNECTION_REFUSED, InetAddress.getByName("127.0.0.1"), 0, out);
     253                        } catch (IOException ioe2) {}
     254                        throw new SOCKSException("connect failed via outproxy plugin", ioe);
     255                    }
     256                } else {
     257                    List<String> proxies = t.getProxies(connPort);
     258                    if (proxies == null || proxies.isEmpty()) {
     259                        String err = "No outproxy configured for port " + connPort + " and no default configured either - host: " + connHostName;
     260                        _log.error(err);
     261                        try {
     262                            sendRequestReply(Reply.CONNECTION_REFUSED, InetAddress.getByName("127.0.0.1"), 0, out);
     263                        } catch (IOException ioe) {}
     264                        throw new SOCKSException(err);
     265                    }
     266                    int p = _context.random().nextInt(proxies.size());
     267                    String proxy = proxies.get(p);
     268                    Destination dest = _context.namingService().lookup(proxy);
     269                    if (dest == null) {
     270                        try {
     271                            sendRequestReply(Reply.CONNECTION_REFUSED, InetAddress.getByName("127.0.0.1"), 0, out);
     272                        } catch (IOException ioe) {}
     273                        throw new SOCKSException("Outproxy not found");
     274                    }
     275                    if (_log.shouldDebug())
     276                        _log.debug("connecting to port " + connPort + " proxy " + proxy + " for " + connHostName + "...");
     277                    // this isn't going to work, these need to be socks outproxies so we need
     278                    // to do a socks session to them?
     279                    destSock = t.createI2PSocket(dest);
    258280                }
    259                 int p = I2PAppContext.getGlobalContext().random().nextInt(proxies.size());
    260                 String proxy = proxies.get(p);
    261                 Destination dest = I2PAppContext.getGlobalContext().namingService().lookup(proxy);
    262                 if (dest == null) {
    263                     try {
    264                         sendRequestReply(Reply.CONNECTION_REFUSED, InetAddress.getByName("127.0.0.1"), 0, out);
    265                     } catch (IOException ioe) {}
    266                     throw new SOCKSException("Outproxy not found");
    267                 }
    268                 if (_log.shouldDebug())
    269                     _log.debug("connecting to port " + connPort + " proxy " + proxy + " for " + connHostName + "...");
    270                 // this isn't going to work, these need to be socks outproxies so we need
    271                 // to do a socks session to them?
    272                 destSock = t.createI2PSocket(dest);
    273281            }
    274282            confirmConnection();
  • apps/i2ptunnel/java/src/net/i2p/i2ptunnel/socks/SOCKS5Server.java

    rb21b953 rcdab6f8b  
    2222import net.i2p.I2PAppContext;
    2323import net.i2p.I2PException;
     24import net.i2p.app.ClientApp;
     25import net.i2p.app.ClientAppManager;
     26import net.i2p.app.Outproxy;
    2427import net.i2p.client.streaming.I2PSocket;
    2528import net.i2p.client.streaming.I2PSocketOptions;
     
    3841 * @author human
    3942 */
    40 public class SOCKS5Server extends SOCKSServer {
    41     private final Log _log;
     43class SOCKS5Server extends SOCKSServer {
    4244
    4345    private static final int SOCKS_VERSION_5 = 0x05;
    4446
    45     private final Socket clientSock;
    4647    private boolean setupCompleted = false;
    4748    private final boolean authRequired;
     
    5859     * @param props non-null
    5960     */
    60     public SOCKS5Server(Socket clientSock, Properties props) {
    61         this.clientSock = clientSock;
    62         this.props = props;
     61    public SOCKS5Server(I2PAppContext ctx, Socket clientSock, Properties props) {
     62        super(ctx, clientSock, props);
    6363        this.authRequired =
    6464                    Boolean.parseBoolean(props.getProperty(I2PTunnelHTTPClientBase.PROP_AUTH)) &&
    6565                    props.containsKey(I2PTunnelHTTPClientBase.PROP_USER) &&
    6666                    props.containsKey(I2PTunnelHTTPClientBase.PROP_PW);
    67         _log = I2PAppContext.getGlobalContext().logManager().getLog(SOCKS5Server.class);
    6867    }
    6968
     
    367366                //I2PSocketManager sm = I2PSocketManagerFactory.createManager();
    368367                //destSock = sm.connect(I2PTunnel.destFromName(connHostName), null);
    369                 Destination dest = I2PAppContext.getGlobalContext().namingService().lookup(connHostName);
     368                Destination dest = _context.namingService().lookup(connHostName);
    370369                if (dest == null) {
    371370                    try {
     
    400399           ****/
    401400            } else {
    402                 List<String> proxies = t.getProxies(connPort);
    403                 if (proxies == null || proxies.isEmpty()) {
    404                     String err = "No outproxy configured for port " + connPort + " and no default configured either";
    405                     _log.error(err);
     401                Outproxy outproxy = getOutproxyPlugin();
     402                if (outproxy != null) {
     403                    // In HTTPClient, we use OutproxyRunner to run a Socket,
     404                    // but here, we wrap a Socket in a I2PSocket and use the regular Runner.
    406405                    try {
    407                         sendRequestReply(Reply.CONNECTION_NOT_ALLOWED_BY_RULESET, AddressType.DOMAINNAME, null, "0.0.0.0", 0, out);
    408                     } catch (IOException ioe) {}
    409                     throw new SOCKSException(err);
    410                 }
    411                 int p = I2PAppContext.getGlobalContext().random().nextInt(proxies.size());
    412                 String proxy = proxies.get(p);
    413                 if (_log.shouldLog(Log.DEBUG))
    414                     _log.debug("connecting to proxy " + proxy + " for " + connHostName + " port " + connPort);
    415 
    416                 try {
    417                     destSock = outproxyConnect(t, proxy);
    418                 } catch (SOCKSException se) {
     406                        destSock = new SocketWrapper(outproxy.connect(connHostName, connPort));
     407                    } catch (IOException ioe) {
     408                        try {
     409                            sendRequestReply(Reply.HOST_UNREACHABLE, AddressType.DOMAINNAME, null, "0.0.0.0", 0, out);
     410                        } catch (IOException ioe2) {}
     411                        throw new SOCKSException("connect failed via outproxy plugin", ioe);
     412                    }
     413                } else {
     414                    List<String> proxies = t.getProxies(connPort);
     415                    if (proxies == null || proxies.isEmpty()) {
     416                        String err = "No outproxy configured for port " + connPort + " and no default configured either";
     417                        _log.error(err);
     418                        try {
     419                            sendRequestReply(Reply.CONNECTION_NOT_ALLOWED_BY_RULESET, AddressType.DOMAINNAME, null, "0.0.0.0", 0, out);
     420                        } catch (IOException ioe) {}
     421                        throw new SOCKSException(err);
     422                    }
     423                    int p = _context.random().nextInt(proxies.size());
     424                    String proxy = proxies.get(p);
     425                    if (_log.shouldLog(Log.DEBUG))
     426                        _log.debug("connecting to proxy " + proxy + " for " + connHostName + " port " + connPort);
    419427                    try {
    420                         sendRequestReply(Reply.HOST_UNREACHABLE, AddressType.DOMAINNAME, null, "0.0.0.0", 0, out);
    421                     } catch (IOException ioe) {}
    422                     throw se;
     428                        destSock = outproxyConnect(t, proxy);
     429                    } catch (SOCKSException se) {
     430                        try {
     431                            sendRequestReply(Reply.HOST_UNREACHABLE, AddressType.DOMAINNAME, null, "0.0.0.0", 0, out);
     432                        } catch (IOException ioe) {}
     433                        throw se;
     434                    }
    423435                }
    424436            }
     
    467479        overrides.setProperty("option.i2p.streaming.connectDelay", "1000");
    468480        I2PSocketOptions proxyOpts = tun.buildOptions(overrides);
    469         Destination dest = I2PAppContext.getGlobalContext().namingService().lookup(proxy);
     481        Destination dest = _context.namingService().lookup(proxy);
    470482        if (dest == null)
    471483            throw new SOCKSException("Outproxy not found");
  • apps/i2ptunnel/java/src/net/i2p/i2ptunnel/socks/SOCKSException.java

    rb21b953 rcdab6f8b  
    2121        super(s);
    2222    }
     23
     24    /** @since 0.9.27 */
     25    public SOCKSException(String s, Throwable t) {
     26        super(s, t);
     27    }
    2328}
  • apps/i2ptunnel/java/src/net/i2p/i2ptunnel/socks/SOCKSServer.java

    rb21b953 rcdab6f8b  
    1010import java.util.Properties;
    1111
     12import net.i2p.I2PAppContext;
     13import net.i2p.app.ClientApp;
     14import net.i2p.app.ClientAppManager;
     15import net.i2p.app.Outproxy;
    1216import net.i2p.client.streaming.I2PSocket;
     17import net.i2p.i2ptunnel.I2PTunnelHTTPClient;
     18import net.i2p.util.Log;
    1319
    1420/**
     
    1723 * @author human
    1824 */
    19 public abstract class SOCKSServer {
     25abstract class SOCKSServer {
    2026
    2127    private static final String PROP_MAPPING_PREFIX = "ipmapping.";
     
    2632    protected int addressType;
    2733
    28     protected Properties props;
     34    protected final I2PAppContext _context;
     35    protected final Socket clientSock;
     36    protected final Properties props;
     37    protected final Log _log;
     38
     39    /** @since 0.9.27 */
     40    protected SOCKSServer(I2PAppContext ctx, Socket clientSock, Properties props) {
     41        _context = ctx;
     42        this.clientSock = clientSock;
     43        this.props = props;
     44        _log = ctx.logManager().getLog(getClass());
     45    }
    2946
    3047    /**
     
    6986    public abstract I2PSocket getDestinationI2PSocket(I2PSOCKSTunnel t) throws SOCKSException;
    7087
     88    /**
     89     *  @since 0.9.27
     90     */
     91    private boolean shouldUseOutproxyPlugin() {
     92        return Boolean.parseBoolean(props.getProperty(I2PTunnelHTTPClient.PROP_USE_OUTPROXY_PLUGIN, "true"));
     93    }
     94
     95    /**
     96     *  @return null if disabled or not installed
     97     *  @since 0.9.27
     98     */
     99    protected Outproxy getOutproxyPlugin() {
     100        if (shouldUseOutproxyPlugin()) {
     101            ClientAppManager mgr = _context.clientAppManager();
     102            if (mgr != null) {
     103                ClientApp op = mgr.getRegisteredApp(Outproxy.NAME);
     104                if (op != null)
     105                    return (Outproxy) op;
     106            }
     107        }
     108        return null;
     109    }
    71110}
  • apps/i2ptunnel/java/src/net/i2p/i2ptunnel/socks/SOCKSServerFactory.java

    rb21b953 rcdab6f8b  
    1313import java.util.Properties;
    1414
     15import net.i2p.I2PAppContext;
    1516import net.i2p.data.DataHelper;
    1617import net.i2p.i2ptunnel.I2PTunnelHTTPClientBase;
     
    1920 * Factory class for creating SOCKS forwarders through I2P
    2021 */
    21 public class SOCKSServerFactory {
     22class SOCKSServerFactory {
    2223
    2324    private final static String ERR_REQUEST_DENIED =
     
    3940     * @param props non-null
    4041     */
    41     public static SOCKSServer createSOCKSServer(Socket s, Properties props) throws SOCKSException {
     42    public static SOCKSServer createSOCKSServer(I2PAppContext ctx, Socket s, Properties props) throws SOCKSException {
    4243        SOCKSServer serv;
    4344
     
    5455                    throw new SOCKSException("SOCKS 4/4a not supported when authorization is required");
    5556                }
    56                 serv = new SOCKS4aServer(s, props);
     57                serv = new SOCKS4aServer(ctx, s, props);
    5758                break;
    5859            case 0x05:
    5960                // SOCKS version 5
    60                 serv = new SOCKS5Server(s, props);
     61                serv = new SOCKS5Server(ctx, s, props);
    6162                break;
    6263            case 'C':
Note: See TracChangeset for help on using the changeset viewer.