Changeset 2849aec


Ignore:
Timestamp:
Nov 27, 2015 8:34:11 PM (5 years ago)
Author:
zzz <zzz@…>
Branches:
master
Children:
01d2371
Parents:
cb979fb
Message:

Add v3 FORWARD support to sink

File:
1 edited

Legend:

Unmodified
Added
Removed
  • apps/sam/java/src/net/i2p/sam/client/SAMStreamSink.java

    rcb979fb r2849aec  
    99import java.net.DatagramPacket;
    1010import java.net.DatagramSocket;
     11import java.net.ServerSocket;
    1112import java.net.Socket;
    1213import java.security.GeneralSecurityException;
     
    1516import java.util.Properties;
    1617import javax.net.ssl.SSLSocket;
     18import javax.net.ssl.SSLServerSocket;
    1719
    1820import gnu.getopt.Getopt;
     
    5052    private static I2PSSLSocketFactory _sslSocketFactory;
    5153   
    52     private static final int STREAM=0, DG=1, V1DG=2, RAW=3, V1RAW=4, RAWHDR = 5;
     54    private static final int STREAM=0, DG=1, V1DG=2, RAW=3, V1RAW=4, RAWHDR = 5, FORWARD = 6;
    5355    private static final String USAGE = "Usage: SAMStreamSink [-s] [-m mode] [-v version] [-b samHost] [-p samPort] [-o opt=val] [-u user] [-w password] myDestFile sinkDir\n" +
    54                                         "       modes: stream: 0; datagram: 1; v1datagram: 2; raw: 3; v1raw: 4 raw-with-headers: 5\n" +
     56                                        "       modes: stream: 0; datagram: 1; v1datagram: 2; raw: 3; v1raw: 4; raw-with-headers: 5; stream-forward: 6\n" +
    5557                                        "       -s: use SSL\n" +
    5658                                        "       multiple -o session options are allowed";
     59    private static final int V3FORWARDPORT=9998;
    5760    private static final int V3DGPORT=9999;
    5861
     
    7679            case 'm':
    7780                mode = Integer.parseInt(g.getOptarg());
    78                 if (mode < 0 || mode > RAWHDR) {
     81                if (mode < 0 || mode > FORWARD) {
    7982                    System.err.println(USAGE);
    8083                    return;
     
    168171                t.start();
    169172            }
    170             if (_isV3 && mode == STREAM) {
     173            if (_isV3 && (mode == STREAM || mode == FORWARD)) {
    171174                // test multiple acceptors, only works in 3.2
    172                 int acceptors = isV32 ? 4 : 1;
     175                int acceptors = (_isV32 && mode == STREAM) ? 4 : 1;
    173176                for (int i = 0; i < acceptors; i++) {
    174177                    Socket sock2 = connect(isSSL);
     
    184187                    if (_log.shouldLog(Log.DEBUG))
    185188                        _log.debug("Handshake " + (2 + i) + " complete.");
     189                }
     190                if (mode == FORWARD) {
     191                    // set up a listening ServerSocket
     192                    (new FwdRcvr(isSSL)).start();
    186193                }
    187194            } else if (_isV3 && (mode == DG || mode == RAW || mode == RAWHDR)) {
     
    245252    }
    246253
     254    private class FwdRcvr extends I2PAppThread {
     255        private final boolean _isSSL;
     256
     257        public FwdRcvr(boolean isSSL) {
     258            if (isSSL)
     259                throw new UnsupportedOperationException("TODO");
     260            _isSSL = isSSL;
     261        }
     262
     263        public void run() {
     264            try {
     265                ServerSocket ss;
     266                if (_isSSL) {
     267                    throw new UnsupportedOperationException("TODO");
     268                } else {
     269                    ss = new ServerSocket(V3FORWARDPORT);
     270                }
     271                while (true) {
     272                    Socket s = ss.accept();
     273                    Sink sink = new Sink("FAKE", "FAKEFROM");
     274                    try {
     275                        InputStream in = s.getInputStream();
     276                        byte[] buf = new byte[32768];
     277                        int len;
     278                        while((len = in.read(buf)) >= 0) {
     279                            sink.received(buf, 0, len);
     280                        }
     281                        sink.closed();
     282                    } catch (IOException ioe) {
     283                        _log.error("Fwdcvr", ioe);
     284                    }
     285                }
     286            } catch (IOException ioe) {
     287                _log.error("Fwdcvr", ioe);
     288            }
     289        }
     290    }
     291
    247292    private static class Pinger extends I2PAppThread {
    248293        private final OutputStream _out;
     
    481526                    //String req = "STREAM ACCEPT SILENT=true ID=" + _v3ID + "\n";
    482527                    // TO_PORT not supported until 3.2 but 3.0-3.1 will ignore
    483                     String req = "STREAM ACCEPT SILENT=false TO_PORT=5678 ID=" + _v3ID + "\n";
     528                    String req;
     529                    if (mode == STREAM)
     530                        req = "STREAM ACCEPT SILENT=false TO_PORT=5678 ID=" + _v3ID + "\n";
     531                    else if (mode == FORWARD)
     532                        req = "STREAM FORWARD ID=" + _v3ID + " PORT=" + V3FORWARDPORT + '\n';
     533                    else
     534                        throw new IllegalStateException("mode " + mode);
    484535                    samOut.write(req.getBytes());
    485536                    samOut.flush();
    486537                    if (_log.shouldLog(Log.DEBUG))
    487                         _log.debug("STREAM ACCEPT sent");
    488                     // docs were wrong, we do not get a STREAM STATUS if SILENT=true
    489                     //boolean ok = eventHandler.waitForStreamStatusReply();
    490                     //if (!ok)
    491                     //    throw new IOException("Stream status failed");
    492                     if (_log.shouldLog(Log.DEBUG))
    493                         _log.debug("got STREAM STATUS, awaiting connection");
     538                        _log.debug("STREAM ACCEPT/FORWARD sent");
     539                    if (mode == FORWARD) {
     540                        // docs were wrong, we do not get a STREAM STATUS if SILENT=true for ACCEPT
     541                        boolean ok = eventHandler.waitForStreamStatusReply();
     542                        if (!ok)
     543                            throw new IOException("Stream status failed");
     544                        if (_log.shouldLog(Log.DEBUG))
     545                            _log.debug("got STREAM STATUS, awaiting connection");
     546                    }
    494547                    return "OK";
    495548                }
     
    531584                }
    532585                String style;
    533                 if (mode == STREAM)
     586                if (mode == STREAM || mode == FORWARD)
    534587                    style = "STREAM";
    535588                else if (mode == V1DG)
Note: See TracChangeset for help on using the changeset viewer.