Changeset 31ace20
- Timestamp:
- Nov 27, 2015 12:46:45 AM (5 years ago)
- Branches:
- master
- Children:
- e77c5bd
- Parents:
- 4291450
- Location:
- apps/sam/java/src/net/i2p/sam/client
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
apps/sam/java/src/net/i2p/sam/client/SAMStreamSend.java
r4291450 r31ace20 7 7 import java.io.OutputStream; 8 8 import java.net.Socket; 9 import java.security.GeneralSecurityException; 9 10 import java.util.HashMap; 10 11 import java.util.Map; 12 import javax.net.ssl.SSLSocket; 11 13 12 14 import gnu.getopt.Getopt; … … 16 18 import net.i2p.data.DataHelper; 17 19 import net.i2p.util.I2PAppThread; 20 import net.i2p.util.I2PSSLSocketFactory; 18 21 import net.i2p.util.Log; 19 22 import net.i2p.util.VersionComparator; … … 39 42 /** Connection id (Integer) to peer (Flooder) */ 40 43 private final Map<String, Sender> _remotePeers; 44 private static I2PSSLSocketFactory _sslSocketFactory; 41 45 42 46 private static final int STREAM=0, DG=1, V1DG=2, RAW=3, V1RAW=4; 43 private static final String USAGE = "Usage: SAMStreamSend [-s] [-m mode] [-v version] [-b samHost] [-p samPort] peerDestFile dataDir\n" +47 private static final String USAGE = "Usage: SAMStreamSend [-s] [-m mode] [-v version] [-b samHost] [-p samPort] [-u user] [-w password] peerDestFile dataDir\n" + 44 48 " modes: stream: 0; datagram: 1; v1datagram: 2; raw: 3; v1raw: 4\n" + 45 49 " -s: use SSL"; 46 50 47 51 public static void main(String args[]) { 48 Getopt g = new Getopt("SAM", args, "sb:m:p: v:");52 Getopt g = new Getopt("SAM", args, "sb:m:p:u:v:w:"); 49 53 boolean isSSL = false; 50 54 int mode = STREAM; … … 52 56 String host = "127.0.0.1"; 53 57 String port = "7656"; 58 String user = null; 59 String password = null; 54 60 int c; 55 61 while ((c = g.getopt()) != -1) { … … 77 83 case 'p': 78 84 port = g.getOptarg(); 85 break; 86 87 case 'u': 88 user = g.getOptarg(); 89 break; 90 91 case 'w': 92 password = g.getOptarg(); 79 93 break; 80 94 … … 93 107 return; 94 108 } 109 if ((user == null && password != null) || 110 (user != null && password == null)) { 111 System.err.println("both user and password or neither"); 112 return; 113 } 114 if (user != null && password != null && VersionComparator.comp(version, "3.2") < 0) { 115 System.err.println("user/password require 3.2"); 116 return; 117 } 95 118 I2PAppContext ctx = I2PAppContext.getGlobalContext(); 96 119 SAMStreamSend sender = new SAMStreamSend(ctx, host, port, 97 120 args[startArgs], args[startArgs + 1]); 98 sender.startup(version, isSSL, mode );121 sender.startup(version, isSSL, mode, user, password); 99 122 } 100 123 … … 111 134 } 112 135 113 public void startup(String version, boolean isSSL, int mode ) {136 public void startup(String version, boolean isSSL, int mode, String user, String password) { 114 137 if (_log.shouldLog(Log.DEBUG)) 115 138 _log.debug("Starting up"); … … 122 145 _log.debug("Reader created"); 123 146 OutputStream out = sock.getOutputStream(); 124 String ourDest = handshake(out, version, true, eventHandler, mode );147 String ourDest = handshake(out, version, true, eventHandler, mode, user, password); 125 148 if (ourDest == null) 126 149 throw new IOException("handshake failed"); … … 135 158 _log.debug("Reader2 created"); 136 159 out = sock2.getOutputStream(); 137 String ok = handshake(out, version, false, eventHandler, mode );160 String ok = handshake(out, version, false, eventHandler, mode, user, password); 138 161 if (ok == null) 139 162 throw new IOException("2nd handshake failed"); … … 173 196 174 197 private Socket connect(boolean isSSL) throws IOException { 175 return new Socket(_samHost, Integer.parseInt(_samPort)); 198 int port = Integer.parseInt(_samPort); 199 if (!isSSL) 200 return new Socket(_samHost, port); 201 synchronized(SAMStreamSink.class) { 202 if (_sslSocketFactory == null) { 203 try { 204 _sslSocketFactory = new I2PSSLSocketFactory( 205 _context, true, "certificates/sam"); 206 } catch (GeneralSecurityException gse) { 207 throw new IOException("SSL error", gse); 208 } 209 } 210 } 211 SSLSocket sock = (SSLSocket) _sslSocketFactory.createSocket(_samHost, port); 212 I2PSSLSocketFactory.verifyHostname(_context, sock, _samHost); 213 return sock; 176 214 } 177 215 178 216 /** @return our b64 dest or null */ 179 private String handshake(OutputStream samOut, String version, boolean isMaster, SAMEventHandler eventHandler, int mode) { 217 private String handshake(OutputStream samOut, String version, boolean isMaster, 218 SAMEventHandler eventHandler, int mode, String user, String password) { 180 219 synchronized (samOut) { 181 220 try { 182 samOut.write(("HELLO VERSION MIN=1.0 MAX=" + version + '\n').getBytes()); 221 if (user != null && password != null) 222 samOut.write(("HELLO VERSION MIN=1.0 MAX=" + version + " USER=" + user + " PASSWORD=" + password + '\n').getBytes()); 223 else 224 samOut.write(("HELLO VERSION MIN=1.0 MAX=" + version + '\n').getBytes()); 183 225 samOut.flush(); 184 226 if (_log.shouldLog(Log.DEBUG)) -
apps/sam/java/src/net/i2p/sam/client/SAMStreamSink.java
r4291450 r31ace20 7 7 import java.io.OutputStream; 8 8 import java.net.Socket; 9 import java.security.GeneralSecurityException; 9 10 import java.util.HashMap; 10 11 import java.util.Map; 11 12 import java.util.Properties; 13 import javax.net.ssl.SSLSocket; 12 14 13 15 import gnu.getopt.Getopt; … … 17 19 import net.i2p.data.DataHelper; 18 20 import net.i2p.util.I2PAppThread; 21 import net.i2p.util.I2PSSLSocketFactory; 19 22 import net.i2p.util.Log; 20 23 import net.i2p.util.VersionComparator; … … 42 45 /** Connection id (Integer) to peer (Flooder) */ 43 46 private final Map<String, Sink> _remotePeers; 47 private static I2PSSLSocketFactory _sslSocketFactory; 44 48 45 49 private static final int STREAM=0, DG=1, V1DG=2, RAW=3, V1RAW=4; 46 private static final String USAGE = "Usage: SAMStreamSink [-s] [-m mode] [-v version] [-b samHost] [-p samPort] myDestFile sinkDir\n" +50 private static final String USAGE = "Usage: SAMStreamSink [-s] [-m mode] [-v version] [-b samHost] [-p samPort] [-u user] [-w password] myDestFile sinkDir\n" + 47 51 " modes: stream: 0; datagram: 1; v1datagram: 2; raw: 3; v1raw: 4\n" + 48 52 " -s: use SSL"; 49 53 50 54 public static void main(String args[]) { 51 Getopt g = new Getopt("SAM", args, "sb:m:p: v:");55 Getopt g = new Getopt("SAM", args, "sb:m:p:u:v:w:"); 52 56 boolean isSSL = false; 53 57 int mode = STREAM; … … 55 59 String host = "127.0.0.1"; 56 60 String port = "7656"; 61 String user = null; 62 String password = null; 57 63 int c; 58 64 while ((c = g.getopt()) != -1) { … … 80 86 case 'p': 81 87 port = g.getOptarg(); 88 break; 89 90 case 'u': 91 user = g.getOptarg(); 92 break; 93 94 case 'w': 95 password = g.getOptarg(); 82 96 break; 83 97 … … 96 110 return; 97 111 } 112 if ((user == null && password != null) || 113 (user != null && password == null)) { 114 System.err.println("both user and password or neither"); 115 return; 116 } 117 if (user != null && password != null && VersionComparator.comp(version, "3.2") < 0) { 118 System.err.println("user/password require 3.2"); 119 return; 120 } 98 121 I2PAppContext ctx = I2PAppContext.getGlobalContext(); 99 122 SAMStreamSink sink = new SAMStreamSink(ctx, host, port, 100 123 args[startArgs], args[startArgs + 1]); 101 sink.startup(version, isSSL, mode );124 sink.startup(version, isSSL, mode, user, password); 102 125 } 103 126 … … 114 137 } 115 138 116 public void startup(String version, boolean isSSL, int mode ) {139 public void startup(String version, boolean isSSL, int mode, String user, String password) { 117 140 if (_log.shouldLog(Log.DEBUG)) 118 141 _log.debug("Starting up"); … … 125 148 if (_log.shouldLog(Log.DEBUG)) 126 149 _log.debug("Reader created"); 127 String ourDest = handshake(out, version, true, eventHandler, mode );150 String ourDest = handshake(out, version, true, eventHandler, mode, user, password); 128 151 if (ourDest == null) 129 152 throw new IOException("handshake failed"); … … 143 166 if (_log.shouldLog(Log.DEBUG)) 144 167 _log.debug("Reader2 created"); 145 String ok = handshake(out, version, false, eventHandler, mode );168 String ok = handshake(out, version, false, eventHandler, mode, user, password); 146 169 if (ok == null) 147 170 throw new IOException("2nd handshake failed"); … … 351 374 352 375 private Socket connect(boolean isSSL) throws IOException { 353 return new Socket(_samHost, Integer.parseInt(_samPort)); 376 int port = Integer.parseInt(_samPort); 377 if (!isSSL) 378 return new Socket(_samHost, port); 379 synchronized(SAMStreamSink.class) { 380 if (_sslSocketFactory == null) { 381 try { 382 _sslSocketFactory = new I2PSSLSocketFactory( 383 _context, true, "certificates/sam"); 384 } catch (GeneralSecurityException gse) { 385 throw new IOException("SSL error", gse); 386 } 387 } 388 } 389 SSLSocket sock = (SSLSocket) _sslSocketFactory.createSocket(_samHost, port); 390 I2PSSLSocketFactory.verifyHostname(_context, sock, _samHost); 391 return sock; 354 392 } 355 393 356 394 /** @return our b64 dest or null */ 357 private String handshake(OutputStream samOut, String version, boolean isMaster, SAMEventHandler eventHandler, int mode) { 395 private String handshake(OutputStream samOut, String version, boolean isMaster, 396 SAMEventHandler eventHandler, int mode, String user, String password) { 358 397 synchronized (samOut) { 359 398 try { 360 samOut.write(("HELLO VERSION MIN=1.0 MAX=" + version + '\n').getBytes()); 399 if (user != null && password != null) 400 samOut.write(("HELLO VERSION MIN=1.0 MAX=" + version + " USER=" + user + " PASSWORD=" + password + '\n').getBytes()); 401 else 402 samOut.write(("HELLO VERSION MIN=1.0 MAX=" + version + '\n').getBytes()); 361 403 samOut.flush(); 362 404 if (_log.shouldLog(Log.DEBUG))
Note: See TracChangeset
for help on using the changeset viewer.