Changeset e5d76a5


Ignore:
Timestamp:
Jan 23, 2009 7:17:27 PM (12 years ago)
Author:
zzz <zzz@…>
Branches:
master
Children:
9a089b7
Parents:
f7170aa
Message:

beginnings of outproxy configuration and routing

Location:
apps/i2ptunnel/java/src/net/i2p/i2ptunnel/socks
Files:
2 edited

Legend:

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

    rf7170aa re5d76a5  
    88
    99import java.net.Socket;
     10import java.util.ArrayList;
     11import java.util.HashMap;
     12import java.util.List;
     13import java.util.Map;
     14import java.util.Properties;
     15import java.util.StringTokenizer;
    1016
    1117import net.i2p.client.streaming.I2PSocket;
     
    2127
    2228    private static final Log _log = new Log(I2PSOCKSTunnel.class);
    23 
     29    private HashMap<String, List<String>> proxies = null;  // port# + "" or "default" -> hostname list
    2430    protected Destination outProxyDest = null;
    2531
     
    3743
    3844        setName(getLocalPort() + " -> SOCKSTunnel");
    39 
     45        parseOptions();
    4046        startRunning();
    4147
     
    5460        }
    5561    }
     62
     63    private static final String PROP_PROXY = "i2ptunnel.socks.proxy.";
     64    private void parseOptions() {
     65        Properties opts = getTunnel().getClientOptions();
     66        proxies = new HashMap(0);
     67        for (Map.Entry e : opts.entrySet()) {
     68           String prop = (String)e.getKey();
     69           if ((!prop.startsWith(PROP_PROXY)) || prop.length() <= PROP_PROXY.length())
     70              continue;
     71           String port = prop.substring(PROP_PROXY.length());
     72           List proxyList = new ArrayList(1);
     73           StringTokenizer tok = new StringTokenizer((String)e.getValue(), ", \t");
     74           while (tok.hasMoreTokens()) {
     75               String proxy = tok.nextToken().trim();
     76               if (proxy.endsWith(".i2p"))
     77                   proxyList.add(proxy);
     78               else
     79                   _log.error("Non-i2p SOCKS outproxy: " + proxy);
     80           }
     81           proxies.put(port, proxyList);
     82        }
     83    }
     84
     85    public HashMap<String, List<String>> getProxyMap() {
     86        return proxies;
     87    }
     88
     89    public List<String> getProxies(int port) {
     90        List<String> rv = proxies.get(port + "");
     91        if (rv == null)
     92            rv = getDefaultProxies();
     93        return rv;
     94    }
     95
     96    public List<String> getDefaultProxies() {
     97        return proxies.get("default");
     98    }
     99
    56100}
  • apps/i2ptunnel/java/src/net/i2p/i2ptunnel/socks/SOCKS5Server.java

    rf7170aa re5d76a5  
    1414import java.net.Socket;
    1515import java.net.SocketException;
    16 
     16import java.util.List;
     17
     18import net.i2p.I2PAppContext;
    1719import net.i2p.I2PException;
    1820import net.i2p.client.streaming.I2PSocket;
     
    3436
    3537    private Socket clientSock = null;
    36 
    3738    private boolean setupCompleted = false;
    3839
     
    275276        }
    276277
     278        DataOutputStream out; // for errors
     279        try {
     280            out = new DataOutputStream(clientSock.getOutputStream());
     281        } catch (IOException e) {
     282            throw new SOCKSException("Connection error (" + e.getMessage() + ")");
     283        }
     284
    277285        // FIXME: here we should read our config file, select an
    278286        // outproxy, and instantiate the proper socket class that
     
    286294                //I2PSocketManager sm = I2PSocketManagerFactory.createManager();
    287295                //destSock = sm.connect(I2PTunnel.destFromName(connHostName), null);
    288                 // TODO get the streaming lib options in there
    289296                destSock = t.createI2PSocket(I2PTunnel.destFromName(connHostName));
    290                 confirmConnection();
    291                 _log.debug("connection confirmed - exchanging data...");
     297            } else if ("localhost".equals(connHostName) || "127.0.0.1".equals(connHostName)) {
     298                String err = "No localhost accesses allowed through the Socks Proxy";
     299                _log.error(err);
     300                try {
     301                    sendRequestReply(Reply.CONNECTION_NOT_ALLOWED_BY_RULESET, AddressType.DOMAINNAME, null, "0.0.0.0", 0, out);
     302                } catch (IOException ioe) {}
     303                throw new SOCKSException(err);
     304            } else if (connPort == 80) {
     305                // rewrite GET line to include hostname??? or add Host: line???
     306                // or forward to local eepProxy (but that's a Socket not an I2PSocket)
     307                // use eepProxy configured outproxies?
     308                String err = "No handler for HTTP outproxy implemented";
     309                _log.error(err);
     310                try {
     311                    sendRequestReply(Reply.CONNECTION_NOT_ALLOWED_BY_RULESET, AddressType.DOMAINNAME, null, "0.0.0.0", 0, out);
     312                } catch (IOException ioe) {}
     313                throw new SOCKSException(err);
    292314            } else {
    293                 // if (connPort == 80) ...
    294                 _log.error("We don't support outproxies (yet)");
    295                 throw new SOCKSException("Ouproxies not supported (yet)");
     315                List<String> proxies = t.getProxies(connPort);
     316                if (proxies == null || proxies.size() <= 0) {
     317                    String err = "No outproxy configured for port " + connPort + " and no default configured either";
     318                    _log.error(err);
     319                    try {
     320                        sendRequestReply(Reply.CONNECTION_NOT_ALLOWED_BY_RULESET, AddressType.DOMAINNAME, null, "0.0.0.0", 0, out);
     321                    } catch (IOException ioe) {}
     322                    throw new SOCKSException(err);
     323                }
     324                int p = I2PAppContext.getGlobalContext().random().nextInt(proxies.size());
     325                String proxy = proxies.get(p);
     326                _log.debug("connecting to port " + connPort + " proxy " + proxy + " for " + connHostName + "...");
     327                // this isn't going to work, these need to be socks outproxies so we need
     328                // to do a socks session to them?
     329                destSock = t.createI2PSocket(I2PTunnel.destFromName(proxy));
    296330            }
     331            confirmConnection();
     332            _log.debug("connection confirmed - exchanging data...");
    297333        } catch (DataFormatException e) {
     334            try {
     335                sendRequestReply(Reply.HOST_UNREACHABLE, AddressType.DOMAINNAME, null, "0.0.0.0", 0, out);
     336            } catch (IOException ioe) {}
    298337            throw new SOCKSException("Error in destination format");
    299338        } catch (SocketException e) {
     339            try {
     340                sendRequestReply(Reply.HOST_UNREACHABLE, AddressType.DOMAINNAME, null, "0.0.0.0", 0, out);
     341            } catch (IOException ioe) {}
    300342            throw new SOCKSException("Error connecting ("
    301343                                     + e.getMessage() + ")");
    302344        } catch (IOException e) {
     345            try {
     346                sendRequestReply(Reply.HOST_UNREACHABLE, AddressType.DOMAINNAME, null, "0.0.0.0", 0, out);
     347            } catch (IOException ioe) {}
    303348            throw new SOCKSException("Error connecting ("
    304349                                     + e.getMessage() + ")");
    305350        } catch (I2PException e) {
     351            try {
     352                sendRequestReply(Reply.HOST_UNREACHABLE, AddressType.DOMAINNAME, null, "0.0.0.0", 0, out);
     353            } catch (IOException ioe) {}
    306354            throw new SOCKSException("Error connecting ("
    307355                                     + e.getMessage() + ")");
Note: See TracChangeset for help on using the changeset viewer.