propagate from branch 'i2p.i2p' (head 79d0ad4538a0adc4ced6ac26cb725abe3d5ccee3)

to branch 'i2p.i2p.zzz.test2' (head 73032545b42f6f9caffffca08d0a8b97f5cf7e3a)
This commit is contained in:
zzz
2014-07-22 14:38:28 +00:00
28 changed files with 496 additions and 228 deletions

View File

@ -1202,22 +1202,23 @@ class PeerCoordinator implements PeerListener
boolean skipped = false; boolean skipped = false;
for(Piece piece : wantedPieces) { for(Piece piece : wantedPieces) {
if (piece.getId() == savedPiece) { if (piece.getId() == savedPiece) {
if (peer.isCompleted() && piece.getPeerCount() > 1) { if (peer.isCompleted() && piece.getPeerCount() > 1 &&
wantedPieces.size() > 2*END_GAME_THRESHOLD) {
// Try to preserve rarest-first // Try to preserve rarest-first
// by not requesting a partial piece that non-seeders also have // by not requesting a partial piece that at least two non-seeders also have
// from a seeder // from a seeder
boolean nonSeeds = false; int nonSeeds = 0;
for (Peer pr : peers) { for (Peer pr : peers) {
PeerState state = pr.state; PeerState state = pr.state;
if (state == null) continue; if (state == null) continue;
BitField bf = state.bitfield; BitField bf = state.bitfield;
if (bf == null) continue; if (bf == null) continue;
if (bf.get(savedPiece) && !pr.isCompleted()) { if (bf.get(savedPiece) && !pr.isCompleted()) {
nonSeeds = true; if (++nonSeeds > 1)
break; break;
} }
} }
if (nonSeeds) { if (nonSeeds > 1) {
skipped = true; skipped = true;
break; break;
} }

View File

@ -671,9 +671,9 @@ public class PluginStarter implements Runnable {
for(ClientAppConfig app : apps) { for(ClientAppConfig app : apps) {
// If the client is a running ClientApp that we want to stop, // If the client is a running ClientApp that we want to stop,
// bypass all the logic below. // bypass all the logic below.
ClientApp ca = ctx.routerAppManager().getClientApp(app.className, LoadClientAppsJob.parseArgs(app.args)); if (action.equals("stop")) {
if (ca != null && ca.getState() == ClientAppState.RUNNING) { ClientApp ca = ctx.routerAppManager().getClientApp(app.className, LoadClientAppsJob.parseArgs(app.args));
if (action.equals("stop")) { if (ca != null && ca.getState() == ClientAppState.RUNNING) {
try { try {
ca.shutdown(LoadClientAppsJob.parseArgs(app.stopargs)); ca.shutdown(LoadClientAppsJob.parseArgs(app.stopargs));
} catch (Throwable t) { } catch (Throwable t) {

View File

@ -391,7 +391,11 @@ class SAMv3Handler extends SAMv1Handler
} else if (domain.equals("NAMING")) { } else if (domain.equals("NAMING")) {
canContinue = execNamingMessage(opcode, props); canContinue = execNamingMessage(opcode, props);
} else if (domain.equals("DATAGRAM")) { } else if (domain.equals("DATAGRAM")) {
// TODO not yet overridden, ID is ignored, most recent DATAGRAM session is used
canContinue = execDatagramMessage(opcode, props); canContinue = execDatagramMessage(opcode, props);
} else if (domain.equals("RAW")) {
// TODO not yet overridden, ID is ignored, most recent RAW session is used
canContinue = execRawMessage(opcode, props);
} else { } else {
if (_log.shouldLog(Log.DEBUG)) if (_log.shouldLog(Log.DEBUG))
_log.debug("Unrecognized message domain: \"" _log.debug("Unrecognized message domain: \""
@ -694,10 +698,10 @@ class SAMv3Handler extends SAMv1Handler
else else
{ {
if (_log.shouldLog(Log.DEBUG)) if (_log.shouldLog(Log.DEBUG))
_log.debug ( "Unrecognized RAW message opcode: \"" _log.debug ( "Unrecognized STREAM message opcode: \""
+ opcode + "\"" ); + opcode + "\"" );
try { try {
notifyStreamResult(true, "I2P_ERROR", "Unrecognized RAW message opcode: "+opcode ); notifyStreamResult(true, "I2P_ERROR", "Unrecognized STREAM message opcode: "+opcode );
} catch (IOException e) {} } catch (IOException e) {}
return false; return false;
} }
@ -716,9 +720,9 @@ class SAMv3Handler extends SAMv1Handler
String dest = props.getProperty("DESTINATION"); String dest = props.getProperty("DESTINATION");
if (dest == null) { if (dest == null) {
notifyStreamResult(verbose, "I2P_ERROR", "Destination not specified in RAW SEND message"); notifyStreamResult(verbose, "I2P_ERROR", "Destination not specified in STREAM CONNECT message");
if (_log.shouldLog(Log.DEBUG)) if (_log.shouldLog(Log.DEBUG))
_log.debug("Destination not specified in RAW SEND message"); _log.debug("Destination not specified in STREAM CONNECT message");
return false; return false;
} }
props.remove("DESTINATION"); props.remove("DESTINATION");

View File

@ -44,6 +44,7 @@ class PacketQueue implements SendMessageStatusListener {
private static final int FINAL_TAGS_TO_SEND = 4; private static final int FINAL_TAGS_TO_SEND = 4;
private static final int FINAL_TAG_THRESHOLD = 2; private static final int FINAL_TAG_THRESHOLD = 2;
private static final long REMOVE_EXPIRED_TIME = 67*1000; private static final long REMOVE_EXPIRED_TIME = 67*1000;
private static final boolean ENABLE_STATUS_LISTEN = false;
public PacketQueue(I2PAppContext context, I2PSession session, ConnectionManager mgr) { public PacketQueue(I2PAppContext context, I2PSession session, ConnectionManager mgr) {
_context = context; _context = context;
@ -134,7 +135,7 @@ class PacketQueue implements SendMessageStatusListener {
if (con != null) { if (con != null) {
if (con.isInbound()) if (con.isInbound())
options.setSendLeaseSet(false); options.setSendLeaseSet(false);
else else if (ENABLE_STATUS_LISTEN)
listenForStatus = true; listenForStatus = true;
} }
options.setTagsToSend(INITIAL_TAGS_TO_SEND); options.setTagsToSend(INITIAL_TAGS_TO_SEND);

View File

@ -614,7 +614,7 @@ public class WebMail extends HttpServlet
} }
catch (Exception e1) { catch (Exception e1) {
showBody = false; showBody = false;
reason += _("Part ({0}) not shown, because of {1}", ident, e1.getClass().getName()) + br; reason += _("Part ({0}) not shown, because of {1}", ident, e1.toString()) + br;
} }
} }
if( html ) if( html )

View File

@ -0,0 +1,45 @@
package net.i2p.client;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import net.i2p.I2PAppContext;
/**
* Bridge to Unix domain socket (or similar).
* <p/>
* This is a stub that does nothing.
* This class is replaced in the Android build.
*
* @author str4d
* @since 0.9.14
*/
public class DomainSocketFactory {
public static String I2CP_SOCKET_ADDRESS = "net.i2p.client.i2cp";
/**
* @throws UnsupportedOperationException always
*/
public DomainSocketFactory(I2PAppContext context) {
throw new UnsupportedOperationException();
}
/**
* Override in Android.
* @throws IOException
* @throws UnsupportedOperationException always
*/
public Socket createSocket(String name) throws IOException {
throw new UnsupportedOperationException();
}
/**
* Override in Android.
* @throws IOException
* @throws UnsupportedOperationException always
*/
public ServerSocket createServerSocket(String name) throws IOException {
throw new UnsupportedOperationException();
}
}

View File

@ -52,6 +52,7 @@ import net.i2p.util.LHMCache;
import net.i2p.util.Log; import net.i2p.util.Log;
import net.i2p.util.OrderedProperties; import net.i2p.util.OrderedProperties;
import net.i2p.util.SimpleTimer2; import net.i2p.util.SimpleTimer2;
import net.i2p.util.SystemVersion;
import net.i2p.util.VersionComparator; import net.i2p.util.VersionComparator;
/** /**
@ -157,6 +158,12 @@ abstract class I2PSessionImpl implements I2PSession, I2CPMessageReader.I2CPMessa
protected static final String PROP_USER = "i2cp.username"; protected static final String PROP_USER = "i2cp.username";
protected static final String PROP_PW = "i2cp.password"; protected static final String PROP_PW = "i2cp.password";
/**
* Use Unix domain socket (or similar) to connect to a router
* @since 0.9.14
*/
protected static final String PROP_DOMAIN_SOCKET = "i2cp.domainSocket";
private static final long VERIFY_USAGE_TIME = 60*1000; private static final long VERIFY_USAGE_TIME = 60*1000;
private static final long MAX_SEND_WAIT = 10*1000; private static final long MAX_SEND_WAIT = 10*1000;
@ -279,6 +286,10 @@ abstract class I2PSessionImpl implements I2PSession, I2CPMessageReader.I2CPMessa
if (_context.isRouterContext()) if (_context.isRouterContext())
// just for logging // just for logging
return "[internal connection]"; return "[internal connection]";
else if (SystemVersion.isAndroid() &&
Boolean.parseBoolean(_options.getProperty(PROP_DOMAIN_SOCKET)))
// just for logging
return "[Domain socket connection]";
return _options.getProperty(I2PClient.PROP_TCP_HOST, "127.0.0.1"); return _options.getProperty(I2PClient.PROP_TCP_HOST, "127.0.0.1");
} }
@ -287,7 +298,9 @@ abstract class I2PSessionImpl implements I2PSession, I2CPMessageReader.I2CPMessa
* @since 0.9.7 was in loadConfig() * @since 0.9.7 was in loadConfig()
*/ */
private int getPort() { private int getPort() {
if (_context.isRouterContext()) if (_context.isRouterContext() ||
(SystemVersion.isAndroid() &&
Boolean.parseBoolean(_options.getProperty(PROP_DOMAIN_SOCKET))))
// just for logging // just for logging
return 0; return 0;
String portNum = _options.getProperty(I2PClient.PROP_TCP_PORT, LISTEN_PORT + ""); String portNum = _options.getProperty(I2PClient.PROP_TCP_PORT, LISTEN_PORT + "");
@ -447,7 +460,7 @@ abstract class I2PSessionImpl implements I2PSession, I2CPMessageReader.I2CPMessa
try { try {
// protect w/ closeSocket() // protect w/ closeSocket()
synchronized(_stateLock) { synchronized(_stateLock) {
// If we are in the router JVM, connect using the interal queue // If we are in the router JVM, connect using the internal queue
if (_context.isRouterContext()) { if (_context.isRouterContext()) {
// _socket and _writer remain null // _socket and _writer remain null
InternalClientManager mgr = _context.internalClientManager(); InternalClientManager mgr = _context.internalClientManager();
@ -457,7 +470,11 @@ abstract class I2PSessionImpl implements I2PSession, I2CPMessageReader.I2CPMessa
_queue = mgr.connect(); _queue = mgr.connect();
_reader = new QueuedI2CPMessageReader(_queue, this); _reader = new QueuedI2CPMessageReader(_queue, this);
} else { } else {
if (Boolean.parseBoolean(_options.getProperty(PROP_ENABLE_SSL))) { if (SystemVersion.isAndroid() &&
Boolean.parseBoolean(_options.getProperty(PROP_DOMAIN_SOCKET))) {
final DomainSocketFactory fact = new DomainSocketFactory(_context);
_socket = fact.createSocket(DomainSocketFactory.I2CP_SOCKET_ADDRESS);
} else if (Boolean.parseBoolean(_options.getProperty(PROP_ENABLE_SSL))) {
try { try {
I2PSSLSocketFactory fact = new I2PSSLSocketFactory(_context, false, "certificates/i2cp"); I2PSSLSocketFactory fact = new I2PSSLSocketFactory(_context, false, "certificates/i2cp");
_socket = fact.createSocket(_hostname, _portNum); _socket = fact.createSocket(_hostname, _portNum);

View File

@ -19,6 +19,7 @@ import net.i2p.data.DataFormatException;
import net.i2p.data.Destination; import net.i2p.data.Destination;
import net.i2p.data.Hash; import net.i2p.data.Hash;
import net.i2p.data.Signature; import net.i2p.data.Signature;
import net.i2p.data.SigningPublicKey;
import net.i2p.util.Log; import net.i2p.util.Log;
/** /**
@ -34,16 +35,11 @@ public final class I2PDatagramDissector {
private final DSAEngine dsaEng = DSAEngine.getInstance(); private final DSAEngine dsaEng = DSAEngine.getInstance();
private final SHA256Generator hashGen = SHA256Generator.getInstance(); private final SHA256Generator hashGen = SHA256Generator.getInstance();
private Hash rxHash; private byte[] rxHash;
private Signature rxSign; private Signature rxSign;
private Destination rxDest; private Destination rxDest;
private final byte[] rxPayload = new byte[DGRAM_BUFSIZE]; private final byte[] rxPayload = new byte[DGRAM_BUFSIZE];
private int rxPayloadLen; private int rxPayloadLen;
private boolean valid; private boolean valid;
/** /**
@ -56,6 +52,17 @@ public final class I2PDatagramDissector {
* Load an I2P repliable datagram into the dissector. * Load an I2P repliable datagram into the dissector.
* Does NOT verify the signature. * Does NOT verify the signature.
* *
* Format is:
* <ol>
* <li>Destination (387+ bytes)
* <li>Signature (40+ bytes, type and length as implied by signing key type in the Destination)
* <li>Payload
* </ol>
*
* For DSA_SHA1 Destinations, the signature is of the SHA-256 Hash of the payload.
*
* As of 0.9.14, for non-DSA_SHA1 Destinations, the signature is of the payload itself.
*
* @param dgram non-null I2P repliable datagram to be loaded * @param dgram non-null I2P repliable datagram to be loaded
* *
* @throws DataFormatException If there's an error in the datagram format * @throws DataFormatException If there's an error in the datagram format
@ -79,14 +86,21 @@ public final class I2PDatagramDissector {
rxPayloadLen = dgStream.read(rxPayload); rxPayloadLen = dgStream.read(rxPayload);
// calculate the hash of the payload // calculate the hash of the payload
this.rxHash = hashGen.calculateHash(rxPayload, 0, rxPayloadLen); if (type == SigType.DSA_SHA1) {
assert this.hashGen.calculateHash(this.extractPayload()).equals(this.rxHash); if (rxHash == null)
rxHash = new byte[Hash.HASH_LENGTH];
// non-caching
hashGen.calculateHash(rxPayload, 0, rxPayloadLen, rxHash, 0);
//assert this.hashGen.calculateHash(this.extractPayload()).equals(this.rxHash);
} else {
rxHash = null;
}
} catch (IOException e) { } catch (IOException e) {
Log log = I2PAppContext.getGlobalContext().logManager().getLog(I2PDatagramDissector.class); Log log = I2PAppContext.getGlobalContext().logManager().getLog(I2PDatagramDissector.class);
log.error("Caught IOException - INCONSISTENT STATE!", e); log.error("Caught IOException - INCONSISTENT STATE!", e);
} catch(AssertionError e) { //} catch(AssertionError e) {
Log log = I2PAppContext.getGlobalContext().logManager().getLog(I2PDatagramDissector.class); // Log log = I2PAppContext.getGlobalContext().logManager().getLog(I2PDatagramDissector.class);
log.error("Assertion failed!", e); // log.error("Assertion failed!", e);
} }
//_log.debug("Datagram payload size: " + rxPayloadLen + "; content:\n" //_log.debug("Datagram payload size: " + rxPayloadLen + "; content:\n"
@ -125,14 +139,16 @@ public final class I2PDatagramDissector {
* Extract the hash of the payload of an I2P repliable datagram (previously * Extract the hash of the payload of an I2P repliable datagram (previously
* loaded with the loadI2PDatagram() method), verifying the datagram * loaded with the loadI2PDatagram() method), verifying the datagram
* signature. * signature.
*
* As of 0.9.14, for signature types other than DSA_SHA1, this returns null.
*
* @return The hash of the payload of the I2P repliable datagram * @return The hash of the payload of the I2P repliable datagram
* @throws I2PInvalidDatagramException if the signature verification fails * @throws I2PInvalidDatagramException if the signature verification fails
*/ */
public Hash getHash() throws I2PInvalidDatagramException { public Hash getHash() throws I2PInvalidDatagramException {
// make sure it has a valid signature // make sure it has a valid signature
this.verifySignature(); this.verifySignature();
return extractHash();
return this.extractHash();
} }
/** /**
@ -178,10 +194,18 @@ public final class I2PDatagramDissector {
* Extract the hash of the payload of an I2P repliable datagram (previously * Extract the hash of the payload of an I2P repliable datagram (previously
* loaded with the loadI2PDatagram() method), without verifying the datagram * loaded with the loadI2PDatagram() method), without verifying the datagram
* signature. * signature.
*
* As of 0.9.14, for signature types other than DSA_SHA1, this returns null.
*
* @return The hash of the payload of the I2P repliable datagram * @return The hash of the payload of the I2P repliable datagram
*/ */
public Hash extractHash() { public Hash extractHash() {
return this.rxHash; if (rxHash == null)
return null;
// make a copy as we will reuse rxHash
byte[] hash = new byte[Hash.HASH_LENGTH];
System.arraycopy(rxHash, 0, hash, 0, Hash.HASH_LENGTH);
return new Hash(hash);
} }
/** /**
@ -194,12 +218,21 @@ public final class I2PDatagramDissector {
if(this.valid) if(this.valid)
return; return;
if (rxSign == null || rxSign.getData() == null || rxDest == null || rxDest.getSigningPublicKey() == null) if (rxSign == null || rxSign.getData() == null || rxDest == null)
throw new I2PInvalidDatagramException("Datagram not yet read"); throw new I2PInvalidDatagramException("Datagram not yet read");
// now validate // now validate
if (!this.dsaEng.verifySignature(rxSign, rxHash.getData(), rxDest.getSigningPublicKey())) SigningPublicKey spk = rxDest.getSigningPublicKey();
throw new I2PInvalidDatagramException("Incorrect I2P repliable datagram signature"); SigType type = spk.getType();
if (type == null)
throw new I2PInvalidDatagramException("unsupported sig type");
if (type == SigType.DSA_SHA1) {
if (!this.dsaEng.verifySignature(rxSign, rxHash, spk))
throw new I2PInvalidDatagramException("Incorrect I2P repliable datagram signature");
} else {
if (!this.dsaEng.verifySignature(rxSign, rxPayload, 0, rxPayloadLen, spk))
throw new I2PInvalidDatagramException("Incorrect I2P repliable datagram signature");
}
// set validated // set validated
this.valid = true; this.valid = true;

View File

@ -16,8 +16,12 @@ import net.i2p.client.I2PSession;
import net.i2p.crypto.DSAEngine; import net.i2p.crypto.DSAEngine;
import net.i2p.crypto.SHA256Generator; import net.i2p.crypto.SHA256Generator;
import net.i2p.data.DataFormatException; import net.i2p.data.DataFormatException;
import net.i2p.data.Hash;
import net.i2p.data.Signature;
import net.i2p.data.SigningPrivateKey; import net.i2p.data.SigningPrivateKey;
import net.i2p.crypto.SigType;
import net.i2p.util.Log; import net.i2p.util.Log;
import net.i2p.util.SimpleByteCache;
/** /**
* Class for creating I2P repliable datagrams. Note that objects of this class * Class for creating I2P repliable datagrams. Note that objects of this class
@ -44,9 +48,9 @@ public final class I2PDatagramMaker {
* @param session I2PSession used to send I2PDatagrams through * @param session I2PSession used to send I2PDatagrams through
*/ */
public I2PDatagramMaker(I2PSession session) { public I2PDatagramMaker(I2PSession session) {
this();
this.setI2PDatagramMaker(session); this.setI2PDatagramMaker(session);
} }
/** /**
* Construct a new I2PDatagramMaker that is null. * Construct a new I2PDatagramMaker that is null.
* Use setI2PDatagramMaker to set the parameters. * Use setI2PDatagramMaker to set the parameters.
@ -59,22 +63,53 @@ public final class I2PDatagramMaker {
sxPrivKey = session.getPrivateKey(); sxPrivKey = session.getPrivateKey();
sxDestBytes = session.getMyDestination().toByteArray(); sxDestBytes = session.getMyDestination().toByteArray();
} }
/** /**
* Make a repliable I2P datagram containing the specified payload. * Make a repliable I2P datagram containing the specified payload.
* *
* Format is:
* <ol>
* <li>Destination (387+ bytes)
* <li>Signature (40+ bytes, type and length as implied by signing key type in the Destination)
* <li>Payload
* </ol>
*
* Maximum datagram size is 32768, so maximum payload size is 32341, or less for
* non-DSA_SHA1 destinations. Practical maximum is a few KB less due to
* ElGamal/AES overhead. 10 KB or less is recommended for best results.
*
* For DSA_SHA1 Destinations, the signature is of the SHA-256 Hash of the payload.
*
* As of 0.9.14, for non-DSA_SHA1 Destinations, the signature is of the payload itself.
*
* @param payload non-null Bytes to be contained in the I2P datagram. * @param payload non-null Bytes to be contained in the I2P datagram.
* @return null on error
* @throws IllegalArgumentException if payload is too big
* @throws IllegalStateException if Destination signature type unsupported
*/ */
public byte[] makeI2PDatagram(byte[] payload) { public byte[] makeI2PDatagram(byte[] payload) {
sxDGram.reset(); sxDGram.reset();
try { try {
sxDGram.write(sxDestBytes); sxDGram.write(sxDestBytes);
SigType type = sxPrivKey.getType();
if (type == null)
throw new IllegalStateException("Unsupported sig type");
dsaEng.sign(hashGen.calculateHash(payload).toByteArray(), Signature sig;
sxPrivKey).writeBytes(sxDGram); if (type == SigType.DSA_SHA1) {
byte[] hash = SimpleByteCache.acquire(Hash.HASH_LENGTH);
// non-caching
hashGen.calculateHash(payload, 0, payload.length, hash, 0);
sig = dsaEng.sign(hash, sxPrivKey);
SimpleByteCache.release(hash);
} else {
sig = dsaEng.sign(payload, sxPrivKey);
}
sig.writeBytes(sxDGram);
sxDGram.write(payload); sxDGram.write(payload);
if (sxDGram.size() > DGRAM_BUFSIZE)
throw new IllegalArgumentException("Too big");
return sxDGram.toByteArray(); return sxDGram.toByteArray();
} catch (IOException e) { } catch (IOException e) {
Log log = I2PAppContext.getGlobalContext().logManager().getLog(I2PDatagramMaker.class); Log log = I2PAppContext.getGlobalContext().logManager().getLog(I2PDatagramMaker.class);

View File

@ -10,6 +10,9 @@ in turn, use the {@link net.i2p.client.datagram.I2PDatagramMaker} to build a
message that can be parsed. </p> message that can be parsed. </p>
<p>The datagram format implemented here includes <p>The datagram format implemented here includes
the sender's {@link net.i2p.data.Destination}, the payload, and a hash of the the sender's {@link net.i2p.data.Destination}, the payload, and a signature
payload (signed by the sender's {@link net.i2p.data.SigningPrivateKey}).</p> (signed by the sender's {@link net.i2p.data.SigningPrivateKey}).
For DSA_SHA1 destinations, the signature is of the SHA-256 Hash of the payload.
For other destination types, the signature is of the payload itself.
</p>
</body></html> </body></html>

View File

@ -18,6 +18,7 @@ import net.i2p.I2PAppContext;
import net.i2p.data.Base64; import net.i2p.data.Base64;
import net.i2p.util.Log; import net.i2p.util.Log;
import net.i2p.util.SecureFileOutputStream; import net.i2p.util.SecureFileOutputStream;
import net.i2p.util.SystemVersion;
/** /**
* Java X.509 certificate utilities, consolidated from various places. * Java X.509 certificate utilities, consolidated from various places.
@ -65,11 +66,18 @@ public class CertUtil {
} }
/** /**
* Get a value out of the subject distinguished name * Get a value out of the subject distinguished name.
*
* Warning - unsupported in Android (no javax.naming), returns null.
*
* @param type e.g. "CN" * @param type e.g. "CN"
* @return value or null if not found * @return value or null if not found
*/ */
public static String getSubjectValue(X509Certificate cert, String type) { public static String getSubjectValue(X509Certificate cert, String type) {
if (SystemVersion.isAndroid()) {
error("Don't call this in Android", new UnsupportedOperationException("I did it"));
return null;
}
type = type.toUpperCase(Locale.US); type = type.toUpperCase(Locale.US);
X500Principal p = cert.getSubjectX500Principal(); X500Principal p = cert.getSubjectX500Principal();
String subj = p.getName(); String subj = p.getName();

View File

@ -14,9 +14,11 @@ import java.security.PublicKey;
import java.security.cert.CertificateFactory; import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate; import java.security.cert.X509Certificate;
import net.i2p.util.SystemVersion;
/** /**
* Dumb storage in a directory for testing. * Simple storage of each cert in a separate file in a directory.
* No sanitization of filenames, unsafe. * Limited sanitization of filenames.
* *
* @since 0.9.9 * @since 0.9.9
*/ */
@ -30,7 +32,9 @@ class DirKeyRing implements KeyRing {
/** /**
* Cert must be in the file (escaped keyName).crt, * Cert must be in the file (escaped keyName).crt,
* and have a CN == keyName * and have a CN == keyName.
*
* CN check unsupported on Android.
*/ */
public PublicKey getKey(String keyName, String scope, SigType type) public PublicKey getKey(String keyName, String scope, SigType type)
throws GeneralSecurityException, IOException { throws GeneralSecurityException, IOException {
@ -49,14 +53,21 @@ class DirKeyRing implements KeyRing {
CertificateFactory cf = CertificateFactory.getInstance("X.509"); CertificateFactory cf = CertificateFactory.getInstance("X.509");
X509Certificate cert = (X509Certificate)cf.generateCertificate(fis); X509Certificate cert = (X509Certificate)cf.generateCertificate(fis);
cert.checkValidity(); cert.checkValidity();
String cn = CertUtil.getSubjectValue(cert, "CN"); if (!SystemVersion.isAndroid()) {
if (!keyName.equals(cn)) // getSubjectValue() unsupported on Android.
throw new GeneralSecurityException("CN mismatch: " + cn); // Any cert problems will be caught in non-Android testing.
String cn = CertUtil.getSubjectValue(cert, "CN");
if (!keyName.equals(cn))
throw new GeneralSecurityException("CN mismatch: " + cn);
}
return cert.getPublicKey(); return cert.getPublicKey();
} finally { } finally {
try { if (fis != null) fis.close(); } catch (IOException foo) {} try { if (fis != null) fis.close(); } catch (IOException foo) {}
} }
} }
/**
* Unimplemented, unused.
*/
public void setKey(String keyName, String scope, PublicKey key) {} public void setKey(String keyName, String scope, PublicKey key) {}
} }

View File

@ -29,7 +29,7 @@ public class SessionKeyManager {
/** /**
* A dummy SessionKeyManager for testing or for passing to * A dummy SessionKeyManager for testing or for passing to
* ElGamalAESEngine.encrypt() * ElGamalAESEngine.decrypt()
* *
* @since 0.9.14 * @since 0.9.14
*/ */
@ -37,7 +37,7 @@ public class SessionKeyManager {
/** /**
* A dummy SessionKeyManager for testing or for passing to * A dummy SessionKeyManager for testing or for passing to
* ElGamalAESEngine.encrypt() * ElGamalAESEngine.decrypt()
* *
* @param context unused * @param context unused
* @since public since 0.9.14; protected before that * @since public since 0.9.14; protected before that

View File

@ -1,3 +1,18 @@
2014-07-19 zzz
* i2psnark: Don't prefer leeches during end game, to
prevent slowdowns or stalls
* SAM: Add support for RAW on the bridge socket in v3 (ticket #1334)
* Streaming; Disable fail-fast for now.
* SusiMail: Better error message on decode fail
2014-07-15 str4d
* I2CP: Stubs for I2CP connections over Unix domain sockets
2014-07-11 zzz
* Datagrams:
- Redefine the repliable datagram signature for non-DSA_SHA1 sig types;
was the sig of the SHA-256 of the payload, now the sig of the payload itself.
2014-07-03 zzz 2014-07-03 zzz
* Base64: * Base64:
- Catch numerous decoding errors that were previously misdecoded (ticket #1318) - Catch numerous decoding errors that were previously misdecoded (ticket #1318)

View File

@ -0,0 +1,32 @@
-----BEGIN CERTIFICATE-----
MIIFgzCCA2ugAwIBAgIEB52rdjANBgkqhkiG9w0BAQ0FADByMQswCQYDVQQGEwJY
WDELMAkGA1UECBMCWFgxCzAJBgNVBAcTAlhYMR4wHAYDVQQKExVJMlAgQW5vbnlt
b3VzIE5ldHdvcmsxDDAKBgNVBAsTA0kyUDEbMBkGA1UEAwwSbWF0dEBkcm9sbGV0
dGUuY29tMB4XDTE0MDcyMTEzMjYxM1oXDTI0MDcyMDEzMjYxM1owcjELMAkGA1UE
BhMCWFgxCzAJBgNVBAgTAlhYMQswCQYDVQQHEwJYWDEeMBwGA1UEChMVSTJQIEFu
b255bW91cyBOZXR3b3JrMQwwCgYDVQQLEwNJMlAxGzAZBgNVBAMMEm1hdHRAZHJv
bGxldHRlLmNvbTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAL5M9wKT
csNLg4EA3fW7LleTQdrm3stPnoUvFmsNZHGgsKt1Nc1qCNis3kr2QEY+4Z398U7r
7xGEQFa7D/9SPHf6n1uVXc9DIcmwBtEB0FPB1XPFp2h00ZXIv24yiLN3GQT1woAM
yEbBWsUgn8K/iMBeA5dU2vPwAbGO/0ibD62frgGdYqU2EeiJ/U6vBmKxvC+q2noL
gnyfQJEJANXgf+Cw/gBaS6yn5ZsYcenLNenID2TQKQ6Q/NxYrDYRdWdId29iwldt
dmNSmASv8C7g9d/isZkpmtYNkE4J4m0W9wKziOoyvLSMo8ec67QmCKaPaYKTHTjx
aUuja02+mnlV4DSdZo6nPkSdokRY0+5e6q7+dIPefu8ealGEAE5oedEfl5iM5Fnz
phTR+ePodBK3sB+bMi1NMppbWugpFpdqs1hg2KNKSSG8C4/eTqf2nnlDiVvvFANc
imt6tk0pZcKqveRiDSgI8mTzTcrNgVClsCLoInY5Vab7onZjY9bGijPQ2i1P6+qu
5G6LiLFW7xFq2BcX1DnTztcJ8Yu9NYHhR21J6u7Dr8YHntes3mnth1F0BX3FVA1s
9SaE9/pNhdqap9owpEhNoE1Ke3LorVLL8jyQsqgRHx8VdhWdi9Ao0mzzeI9HYX0j
nZ7uXK5DqGG74K6eWoS9jZSDJLj3IBkIr3B/AgMBAAGjITAfMB0GA1UdDgQWBBTK
YjH+9Jv82Zqi86r95/1sXUCOnDANBgkqhkiG9w0BAQ0FAAOCAgEAsDyl3dS/5pR1
iDN0zE70HN1Sjv55c5um6N39rgz8JSObbAMihhpjRXPR6yl0PdfVcswdCuEaaykp
ppPNY5ObqZIdqI92XOaOhSA3AkZwZffbwaoXFYiawq1aQG1HP7oxXzWwbnbPOxgz
6ThNP5DJan53Mk8TAhxoJkEJxVlMwIiC+QEgqDNYrP8oNOR2J1EXgzsHheEKObyP
xTwRYFqZU/7BQlFeB0LG1LIy9zXAHlb/XIor10w6ChPDW7DiDwGq3zDJw1d8eiUn
RoPRmFjTqn+3rGaEkk+vUFHoWo7cLCEIC3+P9wlY4Kel+ldXMmuJ+BZ1glFXeO3L
VO85n7iVIyBbwo7RLtNaBvrRQIEG3ld5UOKklLlWwhrX/FXksEhdFvmuF9sbiYNr
cg81sbwZlX7Gi7VicXkykFFXwRRr3UblDtfeevouxk4nMVzcDsmzGeAZKQBvcxHa
Pzc70YwnVRqTc87c0bEwPoxK1Vb26+DILyDjKb/AkTw/rwj6vcJZP2ad+hpiz5Ka
nlbY2cI3JJb0TQiDiOIk+xFqC5oHUTSEmfqA6sA5o/RqdwDpkfpgI5mCwhYzDSLD
jfS+263ylhanl7oz0sM+GtH63owVbYJAFT2EozT9siTIErvJESL4Z80yUQG63d/7
fss8T6gOo19esb/KEMZGZE4pAApakWM=
-----END CERTIFICATE-----

View File

@ -0,0 +1,32 @@
-----BEGIN CERTIFICATE-----
MIIFezCCA2OgAwIBAgIEPSs1SjANBgkqhkiG9w0BAQ0FADBuMQswCQYDVQQGEwJY
WDELMAkGA1UECBMCWFgxCzAJBgNVBAcTAlhYMR4wHAYDVQQKExVJMlAgQW5vbnlt
b3VzIE5ldHdvcmsxDDAKBgNVBAsTA0kyUDEXMBUGA1UEAwwOc2luZHVAbWFpbC5p
MnAwHhcNMTQwNzIxMDAwNjUwWhcNMjQwNzIwMDAwNjUwWjBuMQswCQYDVQQGEwJY
WDELMAkGA1UECBMCWFgxCzAJBgNVBAcTAlhYMR4wHAYDVQQKExVJMlAgQW5vbnlt
b3VzIE5ldHdvcmsxDDAKBgNVBAsTA0kyUDEXMBUGA1UEAwwOc2luZHVAbWFpbC5p
MnAwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCnYMNclgj1gIJfot6f
65jbcXpcqf9hhL/uYiU4+uxVevWyJvNHpMzhPWNN4l3HihJJsINsPs/MsZ83Guva
GW5S/93I617kyjs/ZVpEtfABGewho0m9VCBV2/N1mJpHvvR+9OR+YVuWlTB/8sTG
2smdRj/dkKvewN5PSTQH350yT18NR/DmZUU1Iwa7vrNw8ol3rP3qx9UGpFN3JE7V
Q9cA1nktMiFUm76eOPOoln04WDqW2rvArXzvhSApvt0JsLBrZDzM3cx2Rc2UdjIC
h+Ha+G4CLjszfZfQAFJYPred38Gg6wuXiza/wCBSPiB92i94hIQF/OSeukaMiqwG
dRAcBT84/U9bddqHlIICw14PkNHOGUyJGjGKWQl/2bLX43ghWkUJmsTXS3iVcOTc
gb/7MoCRBdL0q2GyEJXuAoKXD9VqD3g+EdcBTQxS9lhZ0iTR7423pg6FP43VMEUC
HUi/BOX1tCY6iRzD1Su6ISIx7klH/sAWWa+SybLFXWtZJxHXXJICiBHJWRbWgtlu
5V+at66yg/LNpyfW3Am08gDV0kiWUBN2Ct4TX9PAQmNDisNgi2AzdZHIfX6tRpU8
UnNcnZGOh4+HXQwJtI0y83C8TsXJUFYfGFWqXN69sMEmgtX8/w+YUqjtb2GcX1HN
6z9u9lH40JCFHTA/clPqOSQ+MQIDAQABoyEwHzAdBgNVHQ4EFgQU4R6x7ArVpSVs
b8VTBXmodXzyraEwDQYJKoZIhvcNAQENBQADggIBAJEHLSDBRU2x6EalmN2W952p
MEO5lGD+ZfUVK0c44t1O53naffwZx9QmDmrC4TjeQrLOpAXLQ8GJHAGeZVmYRgkf
OioKde5uuqVcxqNxArO8VyYGwsuNVPCaBV+SyIO+EmWogidSIrOP2WsRRS2NBhLV
2dp3TvMeod9bPwRl00guvv9iqL0UVSpQSlfGkAQTVpyADOaQHOzeoCpmtPOfB6OK
syB/Z/6HElKoUbvhynaASLgmo3wM93PVJQ2Ho294bQHtDl2qcOksJQvWfCgi7Zrt
KuHaM/a2kItzI6JmyNFXgsKQSDJ4UvoppppgD7K48zOtSipGuZAADC5w5HdVvIGJ
1Czva8kTcmC6AMc+4tACGqYZEAEokkeXn+pIIqKVj2eQukT/0dLGGHbKmxp3Z0f2
pIH2Draq8JPdacr9P/xqEWUuViaOuC5OBjY8Fg3fmVCpwefIuk+DBhbJjEugB0Cu
brJpqNznoYahkbyAXIA8T+QJYMhoGWmaIcaPWK6K3nArvaxzwJbb9Egyivhyp9Rr
r2QMEZ+cPO8p1mEhKpL/wGqAzYyla8SJ06PzLc1lQeGiClu1nbZj5AgkZ1DLa8SD
iO7+e6rS0q1bzc7smE5JzZRiOVqKij/ReKa2uebLLI4wgAhz5ymaD1HfZY+3dV9T
WX89Xn2UyQf5kHifiDKL
-----END CERTIFICATE-----

View File

@ -357,3 +357,4 @@ anoncoin.i2p=vA4OWvaW6ChyRACDUSq0SiWBB88SBd-3sBAPphzAsUGfQeZMvcmCLM1KuZ9kRLPZnzA
jisko.i2p=YSXAtZN7atC3kAoMLFr6vRcEYf3oUpBonrePtfzt6ydtXIqt501dUqwDXVzKP2Hkmg2Zg9HCdMy8a1JCUZLS-T9sPgYn44FEnWg4j2QFFRafpSTLrdDXMK1CpyQhZUYJr4mzg3MEY37cBGSlodFlAgm-J2sgcog7SEpoZrLJ3wNZU8aisQZlUjvn83McMEnLH-AmcTyO3feLaTX7BJE6L6OB67MBieUH0-uNeolHIne1GzcHBuC-0F~wW6pd1eDFDdoQV81VMWAPnkCPzdIW-rmF0C7nvSqzgBpeoywBmIsZwzRKpWO029vknOcioj5HCkvUT~iZeYqSyoLXcdJjM3c5ZPz0AnPss6wuhhSQTqcIqvF0r42ET6-XerwuWJVlDilKjDmzFZ6sj7ZvNiOs2vwQqyNM00geSWgWs50MEqQU1oE2~05fj9qtBw~kXVn1NqAs0~477mnvNlObTHI72USk8OBQDdEKO-OjzL6T67w5Nn3XXe-UYHXqCBvbgAjgAAAA jisko.i2p=YSXAtZN7atC3kAoMLFr6vRcEYf3oUpBonrePtfzt6ydtXIqt501dUqwDXVzKP2Hkmg2Zg9HCdMy8a1JCUZLS-T9sPgYn44FEnWg4j2QFFRafpSTLrdDXMK1CpyQhZUYJr4mzg3MEY37cBGSlodFlAgm-J2sgcog7SEpoZrLJ3wNZU8aisQZlUjvn83McMEnLH-AmcTyO3feLaTX7BJE6L6OB67MBieUH0-uNeolHIne1GzcHBuC-0F~wW6pd1eDFDdoQV81VMWAPnkCPzdIW-rmF0C7nvSqzgBpeoywBmIsZwzRKpWO029vknOcioj5HCkvUT~iZeYqSyoLXcdJjM3c5ZPz0AnPss6wuhhSQTqcIqvF0r42ET6-XerwuWJVlDilKjDmzFZ6sj7ZvNiOs2vwQqyNM00geSWgWs50MEqQU1oE2~05fj9qtBw~kXVn1NqAs0~477mnvNlObTHI72USk8OBQDdEKO-OjzL6T67w5Nn3XXe-UYHXqCBvbgAjgAAAA
hiddengate.i2p=2BJrMAUHLQBc0CoRnkVpFfkx9dp74qpe3TVlLiXe-RuQGwBNztoYN7WjfmRHF5~KZ-KUEKhA3BbAFuWksGMOi7mV0hUD8Egr5ZG03-ekysSiKmVj3mfMv-GfPTdq5W-OdXK87q1Z~KV-e4Qwq6OFV8VREF81jDeMo4agdV0~388WNaQUjS-Jyh7wInh1XOaENFzsLSBPfbgZMIUEoCe5HiTaXLDTxRnDdLPgkvNfOEV9vT3rCgX2lhd8xVL48q4OObjlZ6DLdQ~O4kSIZoPX~9FWDKPB9nCVCa2zIkbDhBqN7p-r~HSPBUM2nUBB2gwuyYtpiLz3ukqEUGV20VAVZ35RqL-pWl4wAMqy2iRwFcgYnM8tvPGFmJM0lLyPlZdyRSU86QkvvVMUrZYXcylg4uP0WXPeNIP4nXOj5ZR7s9gP3AL4xW4Dh2YqPoCaWWt8J2LZugX7QSHpFVEdWZtxnppD1zDmIsbpm-UAUqdgviTIcFPyhxHaEGMUZ7Gid2FqAAAA hiddengate.i2p=2BJrMAUHLQBc0CoRnkVpFfkx9dp74qpe3TVlLiXe-RuQGwBNztoYN7WjfmRHF5~KZ-KUEKhA3BbAFuWksGMOi7mV0hUD8Egr5ZG03-ekysSiKmVj3mfMv-GfPTdq5W-OdXK87q1Z~KV-e4Qwq6OFV8VREF81jDeMo4agdV0~388WNaQUjS-Jyh7wInh1XOaENFzsLSBPfbgZMIUEoCe5HiTaXLDTxRnDdLPgkvNfOEV9vT3rCgX2lhd8xVL48q4OObjlZ6DLdQ~O4kSIZoPX~9FWDKPB9nCVCa2zIkbDhBqN7p-r~HSPBUM2nUBB2gwuyYtpiLz3ukqEUGV20VAVZ35RqL-pWl4wAMqy2iRwFcgYnM8tvPGFmJM0lLyPlZdyRSU86QkvvVMUrZYXcylg4uP0WXPeNIP4nXOj5ZR7s9gP3AL4xW4Dh2YqPoCaWWt8J2LZugX7QSHpFVEdWZtxnppD1zDmIsbpm-UAUqdgviTIcFPyhxHaEGMUZ7Gid2FqAAAA
i2pdocs.str4d.i2p=CRayYfxrPBELUQ4tYi723g8atsyHwkR0--N8fXggNqJgHsnrKxle0ovH5qj6aqUGToay4ktJEz~opIV2lF605gdGE9rSrPONOU0v737~gzjmLpJoyW03yOhr6lGvTxTKWjgx5xRHctt11DEMlMufY4Q72~EZETE4k5E45V3YqSWGyYIzxdpzzw9zvMe9TaLZTs0ZYFgXRMIu1o5IzTkfK2FfAMNfHMcRESHHK8GcF0TkzZFnvOhtgr~Fywq5B7VMYzwq6a8ws5bPjSjQWbJqX8NR~NZl7gxSMwdlZlcICVFOo-uW9Yna2YfhzM-A5SOx60EsL26YX1VXh1zQ3Rsg2lNXbSPI4dLb9taGWxpZS914L-N3Htgih7VM-Zl1QYQGuNV-9LaEEUQKRPCeKdyG14Yry4YOVDItMFE5CHIDaoFcpD24jPE~0aHmVk~RXOIzVhmtVj~HcpBXWxT4lpIO2V3kzA-ZTvo5I0ollbP5Ep3s0Cj~EfikBhUL6zHsWVC0AAAA i2pdocs.str4d.i2p=CRayYfxrPBELUQ4tYi723g8atsyHwkR0--N8fXggNqJgHsnrKxle0ovH5qj6aqUGToay4ktJEz~opIV2lF605gdGE9rSrPONOU0v737~gzjmLpJoyW03yOhr6lGvTxTKWjgx5xRHctt11DEMlMufY4Q72~EZETE4k5E45V3YqSWGyYIzxdpzzw9zvMe9TaLZTs0ZYFgXRMIu1o5IzTkfK2FfAMNfHMcRESHHK8GcF0TkzZFnvOhtgr~Fywq5B7VMYzwq6a8ws5bPjSjQWbJqX8NR~NZl7gxSMwdlZlcICVFOo-uW9Yna2YfhzM-A5SOx60EsL26YX1VXh1zQ3Rsg2lNXbSPI4dLb9taGWxpZS914L-N3Htgih7VM-Zl1QYQGuNV-9LaEEUQKRPCeKdyG14Yry4YOVDItMFE5CHIDaoFcpD24jPE~0aHmVk~RXOIzVhmtVj~HcpBXWxT4lpIO2V3kzA-ZTvo5I0ollbP5Ep3s0Cj~EfikBhUL6zHsWVC0AAAA
mtn.i2p-projekt.i2p=I6Ha4I7rgR0JyExQnN~4sZz5CfRqdN7o-2t1i2YOExd2CxC4MHHz3nJ5KgBIqeNa0dZbugwMEYMWneXAf8nuy9RKUrjcDvGLqScuU8QCpG-e7UDR8lNregfaOwTuypBQiPh9nrc86Zc2JXyTv0eG3T5Yl1tydqs3qEz5w1vn64uRCrGLEMsnGMIZ4aXexseL6McW9ObIQ0qOIfRG9kc~3~bpD9UM4G04BXPZ1Ao5MUjGoQyxlaNCt1DrvAYcrRArzvv0QGyPjb6HpHLlK2UIoR6SumRuNYpEXCaqbXEnEicx1kB5Pyhcwm0cyaMCx-ZaUU-F1~23VurE41xNMbq4GwXtev4bVP4ycHGHjH-XYJmKrqnesIEp7InSAWfm0gdDHuy9377nSIyAhGLLFlWKtzrZPiKm57SN4~BZSQIF6CI4JutGa0x9EaO8hvzFgaYKgwS~a7-YuZNfx4VHEF2J34DrsJo4qetdPTWTKX1o-ztMP6f7DpWjp4JTKb36YstvAAAA

View File

@ -57,13 +57,13 @@ tunnel.1.option.outbound.priority=15
tunnel.1.startOnLoad=true tunnel.1.startOnLoad=true
# I2P's mtn server # I2P's mtn server
tunnel.2.name=mtn.i2p2.i2p tunnel.2.name=mtn.i2p-projekt.i2p
tunnel.2.description=I2P Monotone Server tunnel.2.description=I2P Monotone Server
tunnel.2.type=client tunnel.2.type=client
tunnel.2.sharedClient=true tunnel.2.sharedClient=true
tunnel.2.interface=127.0.0.1 tunnel.2.interface=127.0.0.1
tunnel.2.listenPort=8998 tunnel.2.listenPort=8998
tunnel.2.targetDestination=mtn.i2p2.i2p:4691 tunnel.2.targetDestination=mtn.i2p-projekt.i2p:4691
tunnel.2.i2cpHost=127.0.0.1 tunnel.2.i2cpHost=127.0.0.1
tunnel.2.i2cpPort=7654 tunnel.2.i2cpPort=7654
tunnel.2.option.inbound.nickname=shared clients tunnel.2.option.inbound.nickname=shared clients
@ -107,7 +107,6 @@ tunnel.4.option.outbound.nickname=shared clients
tunnel.4.option.i2cp.reduceIdleTime=900000 tunnel.4.option.i2cp.reduceIdleTime=900000
tunnel.4.option.i2cp.reduceOnIdle=true tunnel.4.option.i2cp.reduceOnIdle=true
tunnel.4.option.i2cp.reduceQuantity=1 tunnel.4.option.i2cp.reduceQuantity=1
tunnel.4.option.i2p.streaming.connectDelay=1000
tunnel.4.option.inbound.length=3 tunnel.4.option.inbound.length=3
tunnel.4.option.inbound.lengthVariance=0 tunnel.4.option.inbound.lengthVariance=0
tunnel.4.option.outbound.length=3 tunnel.4.option.outbound.length=3

View File

@ -14,7 +14,7 @@ _("Do not use SOCKS for this.")
_("More information can be found on the {0}I2P browser proxy setup page{1}.", "<a href=\"https://geti2p.net/about/browser-config\">", "</a>") _("More information can be found on the {0}I2P browser proxy setup page{1}.", "<a href=\"https://geti2p.net/about/browser-config\">", "</a>")
</p> </p>
<p> <p>
_("Once you have a \"shared clients\" destination listed on the left, please {0}check out{1} our {2}FAQ{3}.", "<b>", "</b>", "<a href=\"http://i2p-project.i2p/faq\">", "</a>") _("Once you have a \"shared clients\" destination listed on the left, please {0}check out{1} our {2}FAQ{3}.", "<b>", "</b>", "<a href=\"http://i2p-projekt.i2p/faq\">", "</a>")
</p> </p>
<p> <p>
_("Point your IRC client to {0}localhost:6668{1} and say hi to us on {2}#i2p{3}.", "<b>", "</b>", "<a href=\"irc://127.0.0.1:6668/i2p\">", "</a>") _("Point your IRC client to {0}localhost:6668{1} and say hi to us on {2}#i2p{3}.", "<b>", "</b>", "<a href=\"irc://127.0.0.1:6668/i2p\">", "</a>")

View File

@ -1,109 +1,96 @@
<div lang="fr"> <div lang="fr">
<ul class="links"><li class="tidylist"><b>Démarrage&hellip;</b><br>Si vous venez juste de lancer I2P, le nombre de <ul class="links"><li class="tidylist"><b>Démarrage&hellip;</b><br>Si vous venez juste de lancer I2P, dans la partie gauche de l'écran en section <i>Pairs</i>, le nombre de <i>pairs actifs</i> indiqué devrait
<i>pairs actifs</i> indiqués dans la section <i>Pairs</i> du "Panneau de surveillance" sur la gauche devrait commencer à augmenter dans les prochaines minutes, puis vous verrez en bas du panneau une <i>Destination locale</i> intitulée <i>Clients partagés</i>, avec éventuellement d'autres clients et serveurs selon comment I2P est configuré (sinon, voir plus bas la <a href=#trouble>section dépannage</a>). Ces <i>destinations locales</i> fournissent des connexions via différent ports (et parfois protocoles) vers le réseau I2P, permettant le fonctionnement de votre client BitTorrent, messagerie, proxy web, et autres services. Votre
commencer à augmenter dans les prochaines minutes et vous verrez alors en bas du panneau une <i>destination locale</i> <a href="/netdb">base de données réseau</a> indique tous les pairs que connaît votre routeur. Vous pouvez surveiller les <a href="/peers">connexions de pairs</a> en cours et voir les <a href="/tunnels">tunnels</a> existants et leur état. D'autres informations sont disponibles dans la <a href="/help">page d'aide</a>.</li>
intitulée <i>Clients partagés</i>, avec d'éventuels autres clients et serveurs suivant la configuration initiale d'I2P
(sinon, voir plus bas la <a href=#trouble>section dépannage</a>). Ces <i>destinations locales</i> fournissent des
connexions sur différent ports (et parfois des protocoles) au réseau I2P, pour permettre le fonctionnement de votre
client BitTorrent, de votre messagerie, du mandataire Internet et autres services. Votre
<a href="/netdb">base de données réseau</a> indique tous les pairs que connaît votre routeur. Vous pouvez surveiller
les <a href="/peers">connexions de pairs</a> en cours et voir les <a href="/tunnels">tunnels</a> existants et leur
état. D'autres informations sont disponibles sur la page d'<a href="/help">aide</a>.</li>
<li class="tidylist"><b>Intégration au réseau</b><br>La première fois que vous lancez I2P l'intégration au réseau peut <li class="tidylist"><b>Intégration au réseau</b><br>La première fois que vous lancez I2P, son intégration au réseau peut prendre quelques minutes, le temps que votre routeur soit connu et trouve d'autres pairs qui amélioreront alors son intégration : soyez patient. Quand I2P démarre, et qu'il fonctionnement normalement, I2P affiche un indicateur d'état, (juste au
prendre quelques minutes, le temps que votre routeur soit connu et trouve d'autres pairs qui amélioreront alors son dessus de la section <i>Destinations locales</i> dans le panneau de contrôle), qui peut vous signaler l'information
intégration: soyez patient. Quand I2P démarre, et en fonctionnement établi, I2P affiche un indicateur d'état, (juste au
dessus de la section <i>destinations locales</i> dans le panneau de surveillance), qui peut vous signaler l'information
"Refus de tunnels"; ce comportement est normal et ne doit pas vous inquiéter! Une fois que les étoiles vertes "Refus de tunnels"; ce comportement est normal et ne doit pas vous inquiéter! Une fois que les étoiles vertes
s'affichent en face des <i>destinations locales</i>, le monde d'I2P vous est ouvert. En voici un aperçu: s'affichent en face des <i>Destinations locales</i>, le monde d'I2P vous est ouvert, et ci-dessous nous vous en présentons quelques unes.
</li></ul> </li></ul>
<h3>Les services sur I2P</h3> <h3>Les services sur I2P</h3>
<ul class="links"> <ul class="links">
<li class="tidylist"><b>Internet invisible &amp; exploration anonyme du web public</b><br>Sur I2P vous pouvez accéder <li class="tidylist"><b>Internet invisible et exploration anonyme du web public</b><br>Sur I2P vous pouvez accéder
à des sites anonymes (les sites eep) et à d'autres services (par exemple SSH sur I2P, IRC, Jabber, etc&hellip;), et à des sites anonymes (les sites eep) et à d'autres services (par exemple SSH sur I2P, IRC, Jabber, etc&hellip;), et
vous pouvez aussi héberger vos propres services anonyme. Vous avez également un accès anonyme au web normal via le vous pouvez aussi héberger vos propres services. Vous pouvez également accéder au web anonymement via le
serveur mandataire sortant ("outproxy") I2P intégré. Pour ceci, serveur mandataire sortant ("outproxy") intégré d'I2P. Pour ceci,
<a href="https://geti2p.net/fr/about/browser-config" target="_blank">configurez votre navigateur</a> pour qu'il utilise le <a href="https://geti2p.net/fr/about/browser-config" target="_blank">configurez votre navigateur</a> afin qu'il utilise le
mandataire <code>127.0.0.1 sur le port 4444</code>, puis promenez-vous sur les sites eep ou non cryptés normaux mandataire <code>127.0.0.1 sur le port 4444</code>, puis promenez-vous sur les sites eep ou non cryptés normaux
(adresses <code>http://</code>. Si vous voulez désactiver ou modifier l'accès mandaté à l'Internet normal, enlevez ou modifiez l'entrée (adresses <code>http://</code>). Si vous voulez désactiver ou modifier l'accès mandaté à l'Internet normal, enlevez ou modifiez l'entrée
<code>false.i2p</code> dans les options de <i>mandataires</i> du <i>gestionnaire de tunnels</i> pour le <code>false.i2p</code> dans les options de <i>mandataires</i> du <i>gestionnaire de tunnels</i> pour le
<a href="/i2ptunnel/edit?tunnel=0" target="_blank">mandataire HTTP I2P</a>. Dans la section "Sites intéressants" <a href="/i2ptunnel/edit?tunnel=0" target="_blank">mandataire HTTP I2P</a>. Dans la section "Sites intéressants"
<a href="#eepsites">ci-dessous</a>, vous trouverez notre petite sélection de sites hébergés sur I2P.</li> <a href="#eepsites">ci-dessous</a>, nous listons quelques uns des eepsites hébergés dans I2P.</li>
<li class="tidylist"><b>Messagerie anonyme</b><br>Le système de messagerie basé sur I2P de Postman est utilisable soit <li class="tidylist"><b>Messagerie anonyme</b><br>Le système de messagerie de Postman, basé sur I2P, est utilisable soit
par le <a href="/webmail">client de messagerie I2P intégré</a> dans la console du routeur (susimail), soit en par le <a href="/webmail">client de messagerie I2P intégré</a> (susimail) dans la console du routeur, soit en
configurant n'importe quel logiciel client de messagerie compatible SMTP et POP3. Les comptes peuvent recevoir et configurant n'importe quel logiciel client de messagerie compatible SMTP et POP3. Les comptes peuvent envoyer et
envoyer du courrier de/vers l'Internet normal. Créez au moins votre compte sur recevoir du courrier vers/depuis l'Internet normal. Pour obtenir un compte visitez
<a href="http://hq.postman.i2p/" target="_blank">hq.postman.i2p</a>. En complément, <a href="http://hq.postman.i2p/" target="_blank">hq.postman.i2p</a>. En complément,
<a href="http://i2pbote.i2p/" target="_blank">I2P-Bote</a> est le nouveau système intra-I2P décentralisé, sécurisé <a href="http://i2pbote.i2p/" target="_blank">I2P-Bote</a> est un nouveau système de messagerie intra-I2P décentralisé, sécurisé
(crypté de bout en bout) et équipé d'un système de relayage anonymo-pseudonymique, ainsi que d'une interface web et d'un (crypté de bout en bout), et équipé d'un système de relayage anonyme/pseudonyme, disposant d'une interface web et d'un
carnet d'adresses intégré. Développé par HungryHobo, il s'installe en tant que <a href="#plugins">greffon</a>.</li> carnet d'adresses intégré. Il est développé par HungryHobo, il s'installe en tant que <a href="#plugins">greffon</a>.</li>
<li class="tidylist"><b>Transfert de fichiers anonyme</b><br><a href="/i2psnark/" target="_blank">I2PSnark</a> est <li class="tidylist"><b>Transfert de fichiers anonyme</b><br><a href="/i2psnark/" target="_blank">I2PSnark</a> est
intégré dans le router I2P. Il permet les transferts anonymes et cryptés intégré dans le router I2P. Il permet de faire des transferts <a href="https://secure.wikimedia.org/wikipedia/fr/wiki/BitTorrent_%28protocole%29" target="_blank">BitTorrent</a> anonymes et cryptés.
<a href="https://secure.wikimedia.org/wikipedia/fr/wiki/BitTorrent_%28protocole%29" target="_blank">BitTorrent</a>. Sponge a développé un autre client bittorrent appelé <a href="http://bob.i2p/Robert.html">Robert</a> écrit en Python.
Sponge a développé en Python un autre client bittorrent appelé <a href="http://bob.i2p/Robert.html">Robert</a>. Il existe aussi un portage d'<a href="http://www.emule-project.net/" target="_blank">eMule/aMule</a> sur I2P appelé
Il y a aussi un portage d'<a href="http://www.emule-project.net/" target="_blank">eMule/aMule</a> sur I2P:&hellip; <a href="http://echelon.i2p/imule/">iMule</a> [Besoin de développeurs !]. Il existe aussi une implémentation anonyme et sécurisée d'un
<a href="http://echelon.i2p/imule/">iMule</a> [Cherche développeurs!], une implémentation anonyme et sécurisée d'un
<a href="https://secure.wikimedia.org/wikipedia/fr/wiki/Gnutella" target="_blank">réseau Gnutella</a> accessible par <a href="https://secure.wikimedia.org/wikipedia/fr/wiki/Gnutella" target="_blank">réseau Gnutella</a> accessible par
<a href="http://echelon.i2p/i2phex/" target="_blank">I2Phex</a> [maintenu par Complication, mais on cherche de nouveaux <a href="http://echelon.i2p/i2phex/" target="_blank">I2Phex</a> [maintenu par Complication, mais on cherche de nouveaux
développeurs!], ainsi que d'autres utilitaires dont un hébergement de fichiers basé sur le navigateur.</li> développeurs !], ainsi que d'autres utilitaires dont l'hébergement de fichiers basé sur navigateur.</li>
<li class="tidylist"><b>Claviotage anonyme (non ça n'est pas le nom de mon chat)</b><br>Lancez votre client IRC (p.e. <li class="tidylist"><b>Tchat anonyme</b><br>Lancez votre logiciel client IRC (p.e.
Chatzilla, Pidgin, XChat, etc&hellip;) et connectez-vous au <a href="irc://127.0.0.1:6668/i2p">serveur</a> sur Chatzilla, Pidgin, XChat, etc&hellip;) et connectez-vous au <a href="irc://127.0.0.1:6668/i2p-help">serveur</a> sur
<code>127.0.0.1 port 6668</code>. Vous n'avez pas besoin de configurer un proxy dans votre client IRC: I2P vous fournit <code>127.0.0.1 port 6668</code>. Vous n'avez pas besoin de configurer un proxy dans votre client IRC: I2P vous fournit
un tunnel IRC local (configuré dans votre client IRC en tant qu'hôte serveur IRC distant). Votre tunnel IRC local un tunnel IRC local (configuré dans votre client IRC en tant que serveur IRC ou hôte distant). Votre tunnel IRC local
sur <code>localhost:6668</code> vous emmènera sur un des deux serveurs hébergés sur I2P par Postman and Badger, mais sur <code>localhost:6668</code> vous emmènera sur un des deux serveurs hébergés sur I2P par Postman and Badger, mais
ni vous ni eux ne sauront où se trouve l'autre, et ni ta maman ni ton gouvernement ne sera capable d'intercepter ta ni vous ni eux ne sauront où se trouve l'autre, et ni ta maman ni ton FAI ni ton gouvernement ne seront capables d'intercepter la
conversation!&hellip; (sauf,&hellip; heu&hellip; regarde quand même dans ton dos!&hellip;ET dans le faux plafond ET dis conversation !. Une fois là-bas, /join
à ton correspondant d'en faire autant&hellip; ET coulez vos PC dans du béton). Une fois là, /join <code>#i2p-help</code>, <code>#i2p-chat</code>, <code>#i2p</code>, <code>#i2p-chat</code> ou <code>#i2p-dev</code>
<code>#i2p-chat</code>, <code>#i2p</code>, <code>#i2p-chat</code> ou <code>#i2p-dev</code> sonts quelques-uns des canaux que vous pourrez joindre. Il y a aussi une
ne sont que quelques unes des possibilités pour mettre la tête dehors, même si ça va pas améliorer le bronzage de ta <a href="http://echelon.i2p/qti2pmessenger/">messagerie instantanée</a> basée-I2P, permettant de faire du tchat anonyme
couenne d'endive.&lt;/délire&gt; Il y a aussi une non surveillable et non censurable, ainsi que d'autres serveurs IRC alternatifs, serveurs Jabber, tchat basé-site-web,
<a href="http://echelon.i2p/qti2pmessenger/">messagerie instantanée</a> à la sauce I2P pour le claviotage anonyme et davantage. Et bien sûr vous avez l'entière liberté de faire tourner vos propres serveurs sur I2P, quelques soient les versions qui
(tiens, le rev'là) non surveillable et non censurable, ainsi que d'autres serveurs IRC, Jabber, website-based chat, vous plaisent, et si vous êtes un développeur, d'écrire vos propres
and more. Et bien sûr vous avez l'entière liberté de faire tourner vos propres serveurs sur I2P, dans la version qui
vous émoustille les papilles, et si vous êtes un développeur, d'écrire vos propres
<a href="http://i2p-projekt.i2p/fr/get-involved/develop/applications" target="_blank">applications I2P</a> (les protocoles <a href="http://i2p-projekt.i2p/fr/get-involved/develop/applications" target="_blank">applications I2P</a> (les protocoles
<a href="https://secure.wikimedia.org/wikipedia/fr/wiki/User_Datagram_Protocol" target="_blank">UDP</a> et <a href="https://secure.wikimedia.org/wikipedia/fr/wiki/User_Datagram_Protocol" target="_blank">UDP</a> et
<a href="https://secure.wikimedia.org/wikipedia/fr/wiki/Transmission_Control_Protocol" target="_blank">TCP</a> <a href="https://secure.wikimedia.org/wikipedia/fr/wiki/Transmission_Control_Protocol" target="_blank">TCP</a>
sont tous deux <a href="http://i2p-projekt.i2p/fr/docs/how/tech-intro#op.transport" target="_blank">compatibles</a>), et sont tous deux <a href="http://i2p-projekt.i2p/fr/docs/how/tech-intro#op.transport" target="_blank">compatibles</a>), et
<a href="http://i2p-projekt.i2p/fr/docs/api/streaming" target="_blank">les flux en temps réel</a> sont aussi au menu. <a href="http://i2p-projekt.i2p/fr/docs/api/streaming" target="_blank">les flux en temps réel</a> sont aussi possibles.
Nous fournissons aussi un accès complet à l'<a href="http://http://docs.i2p-projekt.de/javadoc/" target="_blank">API Java</a>.</li> Nous fournissons aussi un accès complet à l'<a href="http://http://docs.i2p-projekt.de/javadoc/" target="_blank">API Java</a>.</li>
<li class="tidylist"><b>Forums &amp; Blogs</b><br>Si vous cherchez à faire votre propre blog ou forum , vous pourriez <li class="tidylist"><b>Forums &amp; Blogs</b><br>Si vous cherchez à faire votre propre blog ou forum, vous pourriez
être intéressé par <a href="http://syndie-project.i2p/" target="_blank">Syndie</a>, une plateforme décentralisée de être intéressé par <a href="http://syndie.i2p2.de/" target="_blank">Syndie</a>, qui est une plateforme décentralisée de
forum et blog pour I2P [Nids de développeurs! (prononcez à l'anglaise)]. forums et blogs pour I2P [Besoin de développeurs !].
Bien entendu, tous les logiciels de blog, forum et Bien entendu, tous les logiciels habituels de blog, forum et
cms fonctionnent sur I2P, bien qu'il vous soit conseillé de faire très attention à la sécurité quand vous les CMS fonctionnent sur I2P, bien qu'il vous soit conseillé de faire très attention à la sécurité quand vous les
configurez et de tenir tous les logiciels associés (p.e. Php, MySql, Python, Apache) bien à jour et verrouillés! configurez, et tenir tous les logiciels associés (p.e. Php, MySql, Python, Apache) bien à jour et verrouillés !
Vous trouverez aussi un petit nombre de forums I2P dans diverses langues: voir <a href="#eepsites">plus bas</a> Aussi, vous trouverez dans I2P quelques forums communautaires dans diverses langues : voir <a href="#eepsites">plus bas</a>
d'autres suggestions.</li> d'autres suggestions.</li>
<li class="tidylist"><a name="plugins"></a><b>Greffons pour I2P</b><br>Étendez l'usage et la pore d'I2P en <li class="tidylist"><a name="plugins"></a><b>Greffons pour I2P</b><br>Étendez l'utilité d'I2P en
installant des greffons&hellip; blog, chat, partage de fichiers et autres sont déjà écrits ou portés, et n'attendent installant des greffons&hellip; blog, tchat, partage de fichiers et autres greffons sont déjà écrits ou portés, et n'attendent
autre chose que vous les <a href="http://plugins.i2p/plugins/" target="_blank">installiez</a>! que votre <a href="http://plugins.i2p/plugins/" target="_blank">installation</a> !
Consultez la carte (et les secrets du chef) sur <a href="http://plugins.i2p/" target="_blank">plugins.i2p</a>. Consultez la liste sur <a href="http://plugins.i2p/" target="_blank">plugins.i2p</a>.
Si vous êtes <a href="http://plugins.i2p/developers/" target="_blank">développeur</a>, vous disposez d'un Si vous êtes <a href="http://plugins.i2p/developers/" target="_blank">développeur</a>, vous pourrez disposer d'un
environnement d'écriture de greffons indépendant de tout langage dans la environnement d'écriture de greffons indépendant de tout langage, avec
<a href="http://i2p-projekt.i2p/fr/docs/plugins" target="_blank">documentation</a>; les greffons I2P peuvent être codés dans <a href="http://i2p-projekt.i2p/fr/docs/plugins" target="_blank">documentation</a>; les greffons d'I2P peuvent être programmés dans
n'importe quel langage.</li> n'importe quel langage.</li>
</ul> </ul>
<h3>Hébergement crypté anonyme sur I2P</h3> <h3>Hébergement web anonyme crypté sur I2P</h3>
<ul class="links"> <ul class="links">
<li class="tidylist"><b>Prêt à servir!</b><br>I2P arrive avec un serveur intégré, prêt à servir votre propre site web <li class="tidylist"><b>Prêt à servir !</b><br>I2P est fourni avec un serveur web intégré, prêt à héberger votre propre site web
anonyme (eepsite) sur le réseau I2P: une instance <a href="http://jetty.mortbay.org/" target="_blank">Jetty</a> qui anonyme (eepsite) sur le réseau I2P : c'est une instance <a href="http://jetty.mortbay.org/" target="_blank">Jetty</a> qui
écoute sur <a href="http://127.0.0.1:7658/" target="_blank">http://127.0.0.1:7658/</a>. Pour héberger votre propre écoute sur <a href="http://127.0.0.1:7658/" target="_blank">http://127.0.0.1:7658/</a>. Pour héberger votre propre
contenu, placez tout bêtement vos fichiers dans le répertoire <code>eepsite/docroot/</code> (ou déposez n'importe quel contenu, déposez tout simplement vos fichiers dans le répertoire <code>eepsite/docroot/</code> (ou déposez n'importe quel
fichier JSP/Servlet standard .war dans <code>eepsite/webapps</code>, ou des scripts CGI standards dans fichier JSP/Servlet standard .war dans <code>eepsite/webapps</code>, ou des scripts CGI standards dans
<code>eepsite/cgi-bin</code>) et ils s'afficheront. Vous gardez tout loisir de choisir le serveur web qui vous convient <code>eepsite/cgi-bin</code>) et ils s'afficheront. Vous gardez l'entière liberté de remplacer le logiciel serveur intégré afin de choisir un logiciel serveur web qui vous convient, ou encore d'exécuter celui-ci sur un autre tunnel.</li>
pour fonctionner sur I2P et remplacer le serveur intégré, ou exécuter celui-ci sur un autre tunnel.</li>
<li class="tidylist"><b>Démarrez votre tunnel</b><br> <li class="tidylist"><b>Démarrez votre tunnel</b><br>
Après le démarrage de votre <a href="/i2ptunnel/" target="_blank">Tunnel serveurWeb I2P</a>, votre eepsite sera Après le démarrage de votre <a href="/i2ptunnel/" target="_blank">tunnel serveur web I2P</a>, votre eepsite sera
visible (mais pas encore découvrable) par les I2P'nautes. Les instructions détaillées de démarrage de votre eepsite, visible (mais pas encore découvrable) par les autres utilisateurs d'I2P. Les instructions détaillées de démarrage de votre eepsite,
d'enregistrement d'un domaine .i2p et de promotion de votre site sont accessibles via votre propre serveur à d'enregistrement d'un domaine .i2p, et de promotion de votre site, sont accessibles via votre propre serveur web I2P à
l'adresse <a href="http://127.0.0.1:7658/help/" target="_blank">http://127.0.0.1:7658/help/</a>.</li></ul> l'adresse <a href="http://127.0.0.1:7658/help/" target="_blank">http://127.0.0.1:7658/help/</a>.</li></ul>
<a name="eepsites"></a> <a name="eepsites"></a>
@ -111,75 +98,69 @@ l'adresse <a href="http://127.0.0.1:7658/help/" target="_blank">http://127.0.0.1
<ul class="links"> <ul class="links">
<li class="tidylist"><b>Le site officiel de l'Invisible Internet Project (I2P)</b><br> <li class="tidylist"><b>Le site officiel de l'Invisible Internet Project (I2P)</b><br>
<a href="http://i2p-projekt.i2p/" target="_blank">i2p-projekt.i2p</a> et son miroir <a href="http://i2p-projekt.i2p/" target="_blank">i2p-projekt.i2p</a> et son miroir
<a href="http://i2p-projekt.i2p/" target="_blank">i2p-projekt.i2p</a> sont les adresses de connexions sécurisées et <a href="http://i2p-projekt.i2p/" target="_blank">i2p-projekt.i2p</a> : connexions anonymes et sécurisées à <a href="https://geti2p.net/" target="_blank">geti2p.net</a>. Si vous êtes curieux du fonctionnement d'I2P et de la
anonymes des sites classiques <a href="https://geti2p.net/" target="_blank">www.i2p2.de</a> et façon d'y contribuer, ceci est la première porte d'entrée.</li>
<a href="http://geti2p.net/" target="_blank">geti2p.net</a>. Si vous êtes curieux du fonctionnement d'I2P et de la <li class="tidylist"><b>Forums de la communauté I2P</b><br>
façon d'y contribuer, vous venez de trouver la porte d'entrée.</li> <a href="http://forum.i2p/" target="_blank">forum.i2p</a> : connexion anoyme et sécurisée au forum communautaire dans lequel sont discutés les problèmes et idées concernant I2P, et sujets apparentés. Il y a aussi le <a href="http://zzz.i2p/" target="_blank">forum développeurs de zzz</a> concernant les discussions relatives à I2P.</li>
<li class="tidylist"><b>Les fora de la communauté</b><br>
<a href="http://forum.i2p/" target="_blank">forum.i2p</a>: le forum sur lequel les développeurs et les
utilisateurs aiment discuter de problèmes et d'idées relatifs à I2P et aux sujets apparentés, et le
<a href="http://zzz.i2p/" target="_blank">forum des développeurs de zzz</a> également ouvert aux utilisateurs.</li>
<li class="tidylist"><b>Pastebin anonyme I2P</b><br> <li class="tidylist"><b>Pastebin anonyme I2P</b><br>
<a href="http://pastethis.i2p/" target="_blank">pastethis.i2p</a>: service de collage sécurisé et anonyme pour le <a href="http://pastethis.i2p/" target="_blank">pastethis.i2p</a> : service de collage sécurisé et anonyme permettant le
partage de texte et de code au format textuel sur I2P.</li> partage de texte et de code au format textuel via I2P.</li>
<li class="tidylist"><b>Les ressources i2P d'Echelon</b> <li class="tidylist"><b>Les ressources I2P d'Echelon</b>
<br><a href="http://echelon.i2p/" target="_blank">echelon.i2p</a>: dépôt de logiciels I2P (I2PFox, iMule, <br><a href="http://echelon.i2p/" target="_blank">echelon.i2p</a> : dépôt de logiciels I2P avec leurs code sources (quand cela est permis), informations concernant I2P, dont le
I2P-Messenger&hellip;) avec leurs code sources (quand c'est permis), informations sur I2P, dont le <a href="http://echelon.i2p/I2Pguide/index.html" target="_blank">guide du débutant</a>, et pour les plus téméraires
<a href="http://echelon.i2p/I2Pguide/index.html" target="_blank">guide du débutant</a> et pour les plus téméraires, des pré-versions d'I2P à essayer.</li>
les pré-versions d'I2P à essayer.</li> <li class="tidylist"><b>Le Wiki d'Ugha</b><br><a href="http://ugha.i2p/" target="_blank">ugha.i2p</a> : un wiki
<li class="tidylist"><b>Le Wiki d'Ugha</b><br><a href="http://ugha.i2p/" target="_blank">ugha.i2p</a>: un wiki ouvert et anonyme dans lequel chacun peut modifier toutes sortes d'informations concernant I2P, aide pour les débutants,
ouvert et anonyme sur lequel chacun peut modifier toute sorte d'informations sur I2P, l'aide pour les débutants, liens supplémentaires dans le réseau, et plus.</li>
des liens supplémentaires dans le réseau, etc&hellip;</li> <li class="tidylist"><b>The Planet (sur I2P)</b><br><a href="http://planet.i2p/" target="_blank">planet.i2p</a> :
<li class="tidylist"><b>The Planet (sur I2P)</b><br><a href="http://planet.i2p/" target="_blank">planet.i2p</a>: un site web agrégateur RSS qui collecte les nouvelles et évènements concernant I2P et les publie toutes regroupée en un
un site agrégateur RSS qui collecte les nouvelles et évènements concernant I2P et les publie toutes regroupée en un seul endroit. C'est un bon site pour voir la communauté au travail !</li>
seul endroit. Un bon aperçu de la communauté au travail!</li> <li class="tidylist"><b>Moteur de recherches d'eepsites</b><br>
<li class="tidylist"><b>Moteur de recherches eepsites</b><br> <a href="http://eepsites.i2p/" target="_blank">eepsites.i2p</a> : moteur de recherche d'eepsites hébergé
<a href="http://eepsites.i2p/" target="_blank">eepsites.i2p</a>: moteur de recherches sur les contenus I2P hébergé
anonymement.</li> anonymement.</li>
<li class="tidylist"><b>Météo du réseau I2P</b><br> <li class="tidylist"><b>Météo du réseau I2P</b><br>
<a href="http://stats.i2p/cgi-bin/dashboard.cgi" target="_blank">stats.i2p</a>: vérifiez divers aspects des <a href="http://stats.i2p/cgi-bin/dashboard.cgi" target="_blank">stats.i2p</a>: vérifiez divers aspects des
performances du réseau I2P avec ce site superviseur maintenu par zzz.</li> performances du réseau I2P avec ce site superviseur maintenu par zzz.</li>
<li class="tidylist"><b>Découvrez I2P</b><br>Il y a plein d'autres eepsites: suivez simplement les liens que vous <li class="tidylist"><b>Découvrez I2P</b><br>Il y a beaucoup d'autres eepsites : suivez simplement les liens que vous
rencontrez, marquez-les en favoris, et retournez-y souvent!<br></li> rencontrez, marquez-les en favoris, et retournez-y souvent !<br></li>
</ul> </ul>
<h2><a name="trouble"></a>Résolution de problèmes &amp; assistance supplémentaire</h2> <h2><a name="trouble"></a>Résolution de problèmes et assistance supplémentaire</h2>
<ul class="links"> <ul class="links">
<li class="tidylist"><b>Soyez patient!</b><br>I2P peut être long à s'intégrer au réseau la première fois que vous le <li class="tidylist"><b>Soyez patient !</b><br>I2P peut être long à s'intégrer au réseau la première fois que vous le
lancez car il s'amorce en découvrant des pairs supplémentaires. Plus il tourne longtemps, mieux il fonctionnera, donc lancez car il s'amorce dans le réseau et prend connaissance de pairs supplémentaires. Plus il tournera longtemps, mieux il fonctionnera, donc
essayez de le laisser marcher le plus longtemps que vous pouvez, 24h/24 7j/7 si possible! Si après 30mn le nombre essayez de le laisser actif le plus longtemps que vous pouvez, 24h/24 7j/7 si possible ! Si après 30 minutes le nombre
<i>Actifs: [connectés/récents]</i> montre moins de 10 pairs, ou que le nombre de pairs <i>bien intégrés</i> est <i>Actifs: [connectés/récents]</i> montre moins de 10 pairs, ou que le nombre de pairs <i>bien intégrés</i> est
inférieur à 5, voici ce que vous pouvez faire pour trouver l'origine du problème: inférieur à 5, voici ce que vous pouvez faire pour trouver l'origine du problème :
</li> </li>
<li class="tidylist"><b>Vérifiez votre configuration &amp; allocation de bande passante</b><br>I2P fonctionne au mieux <li class="tidylist"><b>Vérifiez votre configuration et votre allocation de bande passante</b><br>I2P fonctionne mieux
quand vous reflétez correctement la vitesse de votre connexion Internet dans la section lorsque vous indiquez exactement la vitesse de votre connexion Internet dans la section
<a href="/config">Gestionnaire de bande passante</a>. <a href="/config">Gestionnaire de bande passante</a>.
I2P est configuré par défaut avec des valeurs volontairement faibles qui ne conviennent généralement pas. Merci de I2P est configuré par défaut avec des valeurs volontairement basses qui ne conviennent généralement pas, alors veuillez
prendre le temps d'adapter ces valeurs à votre cas particulier. Plus vous allouez de bande passante, <i>en particulier prendre le temps d'adapter ces valeurs à votre cas particulier. D'autre part plus vous allouez de bande passante, <i>en particulier
la bande passante sortante</i>, plus vous obtiendrez de bonnes performances.</li> la bande passante sortante</i>, plus vous obtiendrez de bonnes performances de la part du réseau.</li>
<li class="tidylist"><b>Pare-feux, Modems &amp; Routeurs</b><br>Si possible, assurez-vous que I2P/Java dispose d'un <li class="tidylist"><b>Pare-feux, modems, et routeurs</b><br>Si possible, assurez-vous que I2P/Java dispose d'un
accès bidirectionnel à un port accessible depuis Internet en configurant votre modem-routeur(box x-DSL) et le pare-feu accès bidirectionnel à un port accessible depuis Internet en configurant votre modem/routeur/pare-feu
logiciel de votre PC en conséquence. Si vous êtes derrière un pare-feu hors de votre contrôle mais avec un accès d'ordinateur en conséquence. Si vous êtes derrière un pare-feu hors de votre contrôle mais que vous avez un accès
sortant non restrictif, I2P peut quand même fonctionner: vous pouvez désactiver les accès entrants et vous reposer sur sortant sans restriction, I2P peut tout de même fonctionner : vous pouvez désactiver les accès entrants et vous reposer sur
la <a href="http://i2p-projekt.i2p/fr/docs/transport/ssu" target="_blank">détection d'adresse IP par SSU</a> la <a href="http://i2p-projekt.i2p/fr/docs/transport/ssu" target="_blank">détection d'adresse IP par SSU</a>
(<a href="https://secure.wikimedia.org/wikipedia/en/wiki/Hole_punching" target="_blank">firewall hole punching</a>) (<a href="https://secure.wikimedia.org/wikipedia/en/wiki/Hole_punching" target="_blank">firewall hole punching</a>)
pour vous connecter au réseau, et le panneau de surveillance indiquera alors l'état "Réseau: Bloqué par un pare-feu". afin de vous connecter au réseau, et le panneau de contrôle indiquera alors l'état "Réseau: Bloqué par un pare-feu".
Pour obtenir des performances optimales, préférez si possible de donnez accès à I2P l'accès à un Pour obtenir des performances optimales, lorsque c'est possible veuillez vous assurer que le
<b><a href="/config">port externe</a> visible depuis Internet</b>.<br /> <b><a href="/config">port externe</a></b> d'I2P soit visible depuis Internet (lire ci-dessous pour davantage d'informations).<br />
Pendant l'installation, I2P choisit aléatoirement ce port <a href="http://127.0.0.1:7657/config">modifiable ici</a>. Note : pendant l'installation, I2P choisit aléatoirement un numéro de port (<a href="/config">modifiable ici</a>), vous pouvez laisser ce numéro de port ou en choisir un autre, et quel que soit votre choix régler vos pare-feux en conséquence.
Vous pouvez laisser ce port ou en choisir un autre, et quel que soit votre choix régler vos pare-feux en conséquence.
<br /> <br />
Voir plus bas pour d'autres solutions. Voir plus bas pour d'autres solutions.
</li> </li>
<li class="tidylist"><b>Vérifiez vos réglages de mandataire</b><br>Si vous n'avez accès à aucun site eep (même pas <li class="tidylist"><b>Vérifiez vos réglages de mandataire (proxy)</b><br>Si vous n'avez accès à aucun site eep (même pas
à <a href="http://i2p-projekt.i2p/" target="_blank">i2p-projekt.i2p</a>), assurez-vous que le mandataire de votre navigateur à <a href="http://i2p-projekt.i2p/" target="_blank">i2p-projekt.i2p</a>), assurez-vous que le mandataire de votre navigateur
est réglé pour le trafic HTTP (<i>pas</i> https, <i>ni</i> socks) via <code>127.0.0.1 port 4444</code>. Si vous avez est réglé pour accéder au trafic HTTP (<i>pas</i> https, <i>ni</i> socks) via <code>127.0.0.1 port 4444</code>. Si vous avez
besoin d'aide, voici le besoin d'aide, voici le
<a href="http://i2p-projekt.i2p/fr/about/browser-config" target="_blank">guide</a> de configuration du navigateur pour <a href="http://i2p-projekt.i2p/fr/about/browser-config" target="_blank">guide</a> de configuration du navigateur pour
l'utilisation avec I2P, également l'utilisation avec I2P, également
@ -189,14 +170,11 @@ l'utilisation avec I2P, également
<li class="tidylist"><b>Vérifiez vos historiques</b><br>Les <a href="/logs">historiques</a> peuvent aider à <li class="tidylist"><b>Vérifiez vos historiques</b><br>Les <a href="/logs">historiques</a> peuvent aider à
diagnostiquer un problème. Vous pouvez en coller un extrait sur un diagnostiquer un problème. Vous pouvez en coller un extrait sur un
<a href="http://forum.i2p/viewforum.php?f=10" target="_blank">forum</a> pour obtenir de l'aide, ou plutôt le <a href="http://forum.i2p/viewforum.php?f=10" target="_blank">forum</a> pour obtenir de l'aide, ou plutôt le
<a href="http://pastethis.i2p/" target="_blank">coller ici</a> et faire référence au lien sur le canal IRC #i2p-fr <a href="http://pastethis.i2p/" target="_blank">coller ici</a> et demander de l'aide sur IRC en faisant référence à ce lien.
(Freenode).
</li> </li>
<li class="tidylist"><b>Vérifiez que Java est à jour</b><br>Assurez-vous que vous avez la dernière version de Java <li class="tidylist"><b>Vérifiez que Java est à jour</b><br>Assurez-vous que vous avez la dernière version de Java
[vers. 1.6 ou plus récente recommandée, et impérative pour certaines fonctionnalités]. Vérifez la version de votre JRE [vers. 1.6 ou plus récente recommandée, et impérative pour certaines fonctionnalités]. Vérifez la version de votre JRE
(<a href="https://secure.wikimedia.org/wikipedia/fr/wiki/Environnement_d%27ex%C3%A9cution_Java" target="_blank"> (<a href="https://secure.wikimedia.org/wikipedia/fr/wiki/Environnement_d%27ex%C3%A9cution_Java" target="_blank">Java Runtime Environment</a>) en haut de page de la <a href="/logs">page historiques</a>. Si vous êtes un développeur,
Java Runtime Environment</a>) en haut de page de vos <a href="/logs">historiques</a>. Si vous êtes un développeur,
un <a href="https://secure.wikimedia.org/wikipedia/fr/wiki/Java_Development_Kit" target="_blank">SDK Java</a> et un <a href="https://secure.wikimedia.org/wikipedia/fr/wiki/Java_Development_Kit" target="_blank">SDK Java</a> et
<a href="http://ant.apache.org/" target="_blank">Apache Ant</a> sont nécessaires à la compilation des sources. <a href="http://ant.apache.org/" target="_blank">Apache Ant</a> sont nécessaires à la compilation des sources.
</li> </li>
@ -211,55 +189,52 @@ consultez la documentation appropriée, visitez les forums, ou venez faire un to
<li class="tidylist"><b>Activez Universal Plug and Play (UPnP)</b><br>Votre modem-routeur est peut-être compatible avec <li class="tidylist"><b>Activez Universal Plug and Play (UPnP)</b><br>Votre modem-routeur est peut-être compatible avec
<a href="https://secure.wikimedia.org/wikipedia/en/wiki/Universal_Plug_and_Play" target="_blank">Universal Plug <a href="https://secure.wikimedia.org/wikipedia/en/wiki/Universal_Plug_and_Play" target="_blank">Universal Plug
&amp; Play</a> (UPnP) qui permet le transfert de ports automatique. Vérifiez que le support UPnP pour I2P est activé &amp; Play</a> (UPnP), lequel permet le transfert de ports automatiquement. Vérifiez que le support UPnP pour I2P est activé
dans la page de <a href="/config">configuration</a>, puis essayez d'activer UPnP dans votre modem-routeur et dans la <a href="/config">page de configuration</a>, puis essayez d'activer UPnP dans votre modem/routeur et
éventuellement dans votre ordinateur. Maintenant, <a href="/">redémarrez le routeur I2P</a>. Si ça marche, le panneau éventuellement aussi dans votre ordinateur. Maintenant, <a href="/">redémarrez le routeur I2P</a>. Si cela marche, le panneau
de surveillance devrait alors indiquer "Réseau: OK" une fois que le routeur I2P aura terminé ses tests de connectivité. de contrôle devrait alors indiquer "Réseau: OK" une fois que le routeur I2P aura terminé ses tests de connectivité.
</li> </li>
<li class="tidylist"><b>Redirection de ports</b><br>Ouvrez le <a href="/config">port d'I2P</a> sur votre modem, routeur <li class="tidylist"><b>Redirection de ports</b><br>Ouvrez le <a href="http://127.0.0.1:7657/config">port d'I2P</a> sur votre modem, routeur
et/ou pare-feu(x) logiciels pour améliorer la connectivité (idéalement, pour UDP et TCP). Plus d'informations sur la et/ou pare-feu(x) logiciels afin d'améliorer la connectivité (dans l'idéal pour UDP et TCP). Beaucoup d'informations sur la
façon de s'y prendre pour divers matériels est accessible sur façon de s'y prendre avec divers matériels sont accessibles sur
<a href="http://portforward.com/" target="_blank">portforward.com</a>, avec nos forums et canaux IRC listés ci-dessous. <a href="http://portforward.com/" target="_blank">portforward.com</a>, en plus de nos forums et canaux IRC listés ci-dessous.
Notez qu'I2P ne prend pas en charge la connexion à Internet via des mandataires (proxies) http ou socks [correctifs Notez qu'I2P ne prend pas en charge la connexion à Internet via des mandataires (proxies) http ou socks [améliorations
bienvenus!], bien qui vous puissiez vous connecter à des mandataires via I2P lui-même quand il connecté au réseau</li> bienvenues !], cependant vous pourrez vous connecter à des mandataires via I2P lui-même une fois connecté au réseau</li>
<li class="tidylist"><b>Aide en ligne</b><br>Vous pouvez trouver de l'information à parcourir sur le <li class="tidylist"><b>Aide en ligne</b><br>Vous pouvez trouver de l'information à parcourir sur le
<a href="http://i2p-projekt.i2p/" target="_blank">site web I2P</a>, poster des messages sur le <a href="http://i2p-projekt.i2p/" target="_blank">site web I2P</a>, poster des messages dans le
<a href="http://forum.i2p/" target="_blank">forum de discussion I2P</a>, ou louvoyer sur les canaux IRC <a href="http://forum.i2p/" target="_blank">forum de discussion I2P</a>,
<a href="irc://127.0.0.1:6668/i2p">#i2p</a> ou encore ou aller sur les canaux IRC
<a href="irc://127.0.0.1:6668/i2p-chat">#i2p-chat</a> dans le réseau interne I2P (<code>irc.postman.i2p</code>, irc.echelon.i2p ou <a href="irc://127.0.0.1:6668/i2p-help">#i2p-help</a>, <a href="irc://127.0.0.1:6668/i2p">#i2p</a> ou encore
<code>irc.dg.i2p</code>). Ces canaux sont aussi accessibles de façon non cryptée en dehors du réseau anonyme <a href="irc://127.0.0.1:6668/i2p-chat">#i2p-chat</a> dans le réseau interne I2P (<code>irc.postman.i2p</code> ou
via le serveur IRC <a href="irc://irc.freenode.net/i2p">Freenode</a>. <code>irc.freshcoffee.i2p</code>). Ces canaux sont aussi accessibles de façon ni cryptée, ni anonyme, en dehors du réseau I2P via le réseau serveur IRC <a href="irc://irc.freenode.net/i2p">Freenode</a>.
</li> </li>
<li class="tidylist"><b>Rapports de bogues</b><br>Si vous voulez rapporter un bogue, merci d'enregistrer un ticket sur <li class="tidylist"><b>Rapports de bogues</b><br>Si vous voulez rapporter un bogue, veuillez enregistrer un ticket sur
<a href="http://trac.i2p2.i2p/" target="_blank">trac.i2p2.i2p</a>. Les développeurs discutent sur les <a href="http://trac.i2p2.i2p/" target="_blank">trac.i2p2.i2p</a>. Les développeurs discutent sur les
<a href="http://zzz.i2p/" target="_blank">fora de développeurs de zzz</a> ou sur le <a href="http://zzz.i2p/" target="_blank">forums de développeurs de zzz</a>, et dans le
<a href="irc://127.0.0.1:6668/i2p-dev">canal des développeurs</a>. Les développeurs peuvent consulter les sources sur <a href="irc://127.0.0.1:6668/i2p-dev">canal des développeurs</a> sur le réseau IRC. Les développeurs peuvent consulter les sources sur
<a href="http://killyourtv.i2p/viewmtn/" target="_blank">l'explorateur du dépôt de kytv</a> ou par <a href="http://killyourtv.i2p/viewmtn/" target="_blank">l'explorateur de dépôt mtn hébergé par Kytv</a> ou sur
<a href="https://github.com/i2p/i2p.i2p" target="_blank">Github</a>. Nous utilisons <a href="http://trac.i2p2.i2p/browser" target="_blank">trac.i2p2.i2p</a>. Nous utilisons
<a href="http://i2p-projekt.i2p/fr/get-involved/guides/monotone" target="_blank">monotone</a> pour gérer les sources du code. <a href="http://i2p-projekt.i2p/fr/get-involved/guides/monotone" target="_blank">monotone</a> pour gérer nos codes sources.
</li> </li>
<li class="tidylist"><b>Impliquez-vous!</b><br>I2P est principalement développé et maintenu bénévolement par les <li class="tidylist"><b>Impliquez-vous!</b><br>I2P est principalement développé et maintenu bénévolement par les
membres dévoués d'une équipe de développeurs. Nous acceptons les membres de la communauté. Nous seront heureux d'accepter des
<a href="http://i2p-projekt.i2p/fr/get-involved/donate" target="_blank">dons</a>. Ils sont essentiellement affectés aux coûts <a href="http://i2p-projekt.i2p/fr/get-involved/donate" target="_blank">dons</a>, ils sont essentiellement affectés aux frais
administratifs et d'hébergements. Nous avons un système de d'hébergements et administratifs. Nous avons un système de
<a href="http://i2p-projekt.i2p/fr/get-involved/bounties" target="_blank">primes</a> pour certains aspects d'I2P à l'intention de <a href="http://i2p-projekt.i2p/fr/get-involved/bounties" target="_blank">primes</a> pour certains aspects d'I2P à l'intention de
développeurs qui rechercheraient des incitations, et nous sommes en recherche permanente de plus de développeurs qui rechercheraient des incitations à participer, et nous sommes en recherche permanente de davantage de
<a href="http://i2p-projekt.i2p/fr/get-involved/guides/new-developers" target="_blank">codeurs Java</a>, de <a href="http://i2p-projekt.i2p/fr/get-involved/guides/new-developers" target="_blank">codeurs Java</a>, de
<a href="http://i2p-projekt.i2p/fr/get-involved/guides/new-translators" target="_blank">traducteurs</a>, de prescripteurs et <a href="http://i2p-projekt.i2p/fr/get-involved/guides/new-translators" target="_blank">traducteurs</a>, de prescripteurs, et
d'utilisateurs pour accélérer la diffusion d'I2P. Plus grand sera le réseau I2P, plus tout le monde en profitera, d'utilisateurs, afin d'accélérer la diffusion d'I2P. Plus grand sera le réseau I2P, plus tout le monde en profitera,
alors en parler simplement à l'apéro avec vos amis au lieu de vous étriper pour savoir si le PSG est plus tafiole alors parlez-en simplement à vos amis (et donnez leur un coup de main si nécessaire pour l'installation), ce sera une grande participation !. Pour en savoir plus sur les diverses façons de participer, voyez
que l'OM n'est tarlouze, (et tendre la main à votre pire ennemi pour l'installation et les réglages chaque fois que la page "<a href="http://i2p-projekt.i2p/fr/get-involved" target="_blank">Impliquez-vous!</a>" du site web.
le besoin s'en fait sentir) sera une belle participation! Pour en savoir plus sur les façons de participer, venez
visiter le zoo sur la page "<a href="http://i2p-projekt.i2p/fr/get-involved" target="_blank">Engagez-vous!</a>" du
site web.
</li> </li>
</ul> </ul>
<div class="topness"><a href="#top">[Haut de page]</a></div> <div class="topness"><a href="#top">[Haut de page]</a></div>
<div class="footnote"><hr>Document mis à jour en février 2011</div> <div class="footnote"><hr>Document mis à jour en juillet 2014</div>
</div> </div>

View File

@ -18,7 +18,7 @@ public class RouterVersion {
/** deprecated */ /** deprecated */
public final static String ID = "Monotone"; public final static String ID = "Monotone";
public final static String VERSION = CoreVersion.VERSION; public final static String VERSION = CoreVersion.VERSION;
public final static long BUILD = 14; public final static long BUILD = 19;
/** for example "-test" */ /** for example "-test" */
public final static String EXTRA = ""; public final static String EXTRA = "";

View File

@ -64,7 +64,9 @@ class ClientListenerRunner implements Runnable {
return new ServerSocket(_port, 0, InetAddress.getByName(listenInterface)); return new ServerSocket(_port, 0, InetAddress.getByName(listenInterface));
} }
} }
public void run() { runServer(); }
/** /**
* Start up the socket listener, listens for connections, and * Start up the socket listener, listens for connections, and
* fires those connections off via {@link #runConnection runConnection}. * fires those connections off via {@link #runConnection runConnection}.
@ -72,7 +74,7 @@ class ClientListenerRunner implements Runnable {
* failure. * failure.
* *
*/ */
public void runServer() { protected void runServer() {
_running = true; _running = true;
int curDelay = 1000; int curDelay = 1000;
while (_running) { while (_running) {
@ -173,5 +175,4 @@ class ClientListenerRunner implements Runnable {
_socket = null; _socket = null;
} catch (IOException ioe) {} } catch (IOException ioe) {}
} }
public void run() { runServer(); }
} }

View File

@ -10,8 +10,10 @@ package net.i2p.router.client;
import java.io.IOException; import java.io.IOException;
import java.io.Writer; import java.io.Writer;
import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.HashSet; import java.util.HashSet;
import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.LinkedBlockingQueue;
@ -37,6 +39,7 @@ import net.i2p.router.JobImpl;
import net.i2p.router.RouterContext; import net.i2p.router.RouterContext;
import net.i2p.util.I2PThread; import net.i2p.util.I2PThread;
import net.i2p.util.Log; import net.i2p.util.Log;
import net.i2p.util.SystemVersion;
/** /**
* Coordinate connections and various tasks * Coordinate connections and various tasks
@ -45,7 +48,7 @@ import net.i2p.util.Log;
*/ */
class ClientManager { class ClientManager {
private final Log _log; private final Log _log;
protected ClientListenerRunner _listener; protected final List<ClientListenerRunner> _listeners;
// Destination --> ClientConnectionRunner // Destination --> ClientConnectionRunner
// Locked for adds/removes but not lookups // Locked for adds/removes but not lookups
private final Map<Destination, ClientConnectionRunner> _runners; private final Map<Destination, ClientConnectionRunner> _runners;
@ -87,6 +90,7 @@ class ClientManager {
// "How large are messages received by the client?", // "How large are messages received by the client?",
// "ClientMessages", // "ClientMessages",
// new long[] { 60*1000l, 60*60*1000l, 24*60*60*1000l }); // new long[] { 60*1000l, 60*60*1000l, 24*60*60*1000l });
_listeners = new ArrayList<ClientListenerRunner>();
_runners = new ConcurrentHashMap<Destination, ClientConnectionRunner>(); _runners = new ConcurrentHashMap<Destination, ClientConnectionRunner>();
_runnersByHash = new ConcurrentHashMap<Hash, ClientConnectionRunner>(); _runnersByHash = new ConcurrentHashMap<Hash, ClientConnectionRunner>();
_pendingRunners = new HashSet<ClientConnectionRunner>(); _pendingRunners = new HashSet<ClientConnectionRunner>();
@ -105,14 +109,22 @@ class ClientManager {
/** Todo: Start a 3rd listener for IPV6? */ /** Todo: Start a 3rd listener for IPV6? */
protected void startListeners() { protected void startListeners() {
ClientListenerRunner listener;
if (SystemVersion.isAndroid()) {
listener = new DomainClientListenerRunner(_ctx, this);
Thread t = new I2PThread(listener, "DomainClientListener", true);
t.start();
_listeners.add(listener);
}
if (!_ctx.getBooleanProperty(PROP_DISABLE_EXTERNAL)) { if (!_ctx.getBooleanProperty(PROP_DISABLE_EXTERNAL)) {
// there's no option to start both an SSL and non-SSL listener // there's no option to start both an SSL and non-SSL listener
if (_ctx.getBooleanProperty(PROP_ENABLE_SSL)) if (_ctx.getBooleanProperty(PROP_ENABLE_SSL))
_listener = new SSLClientListenerRunner(_ctx, this, _port); listener = new SSLClientListenerRunner(_ctx, this, _port);
else else
_listener = new ClientListenerRunner(_ctx, this, _port); listener = new ClientListenerRunner(_ctx, this, _port);
Thread t = new I2PThread(_listener, "ClientListener:" + _port, true); Thread t = new I2PThread(listener, "ClientListener:" + _port, true);
t.start(); t.start();
_listeners.add(listener);
} }
_isStarted = true; _isStarted = true;
} }
@ -132,8 +144,9 @@ class ClientManager {
public synchronized void shutdown(String msg) { public synchronized void shutdown(String msg) {
_isStarted = false; _isStarted = false;
_log.info("Shutting down the ClientManager"); _log.info("Shutting down the ClientManager");
if (_listener != null) for (ClientListenerRunner listener : _listeners)
_listener.stopListening(); listener.stopListening();
_listeners.clear();
Set<ClientConnectionRunner> runners = new HashSet<ClientConnectionRunner>(); Set<ClientConnectionRunner> runners = new HashSet<ClientConnectionRunner>();
synchronized (_runners) { synchronized (_runners) {
for (ClientConnectionRunner runner : _runners.values()) { for (ClientConnectionRunner runner : _runners.values()) {
@ -169,8 +182,13 @@ class ClientManager {
return hisQueue; return hisQueue;
} }
public boolean isAlive() { public synchronized boolean isAlive() {
return _isStarted && (_listener == null || _listener.isListening()); boolean listening = true;
if (!_listeners.isEmpty()) {
for (ClientListenerRunner listener : _listeners)
listening = listening && listener.isListening();
}
return _isStarted && (_listeners.isEmpty() || listening);
} }
public void registerConnection(ClientConnectionRunner runner) { public void registerConnection(ClientConnectionRunner runner) {

View File

@ -0,0 +1,31 @@
package net.i2p.router.client;
import java.io.IOException;
import java.net.ServerSocket;
import net.i2p.client.DomainSocketFactory;
import net.i2p.router.RouterContext;
/**
* Unix domain socket version of ClientListenerRunner.
* <p/>
* This is a stub that does nothing.
* This class is replaced in the Android build.
*
* @author str4d
* @since 0.9.14
*/
public class DomainClientListenerRunner extends ClientListenerRunner {
public DomainClientListenerRunner(RouterContext context, ClientManager manager) {
super(context, manager, -1);
}
/**
* @throws IOException
*/
@Override
protected ServerSocket getServerSocket() throws IOException {
final DomainSocketFactory fact = new DomainSocketFactory(_context);
return fact.createServerSocket(DomainSocketFactory.I2CP_SOCKET_ADDRESS);
}
}

View File

@ -181,7 +181,7 @@ class SSLClientListenerRunner extends ClientListenerRunner {
* Create (if necessary) and load the key store, then run. * Create (if necessary) and load the key store, then run.
*/ */
@Override @Override
public void runServer() { protected void runServer() {
File keyStore = new File(_context.getConfigDir(), "keystore/i2cp.ks"); File keyStore = new File(_context.getConfigDir(), "keystore/i2cp.ks");
if (verifyKeyStore(keyStore) && initializeFactory(keyStore)) { if (verifyKeyStore(keyStore) && initializeFactory(keyStore)) {
super.runServer(); super.runServer();

View File

@ -534,7 +534,9 @@ public class Reseeder {
break; break;
} }
} catch (Throwable t) { } catch (Throwable t) {
_log.warn("Error reseeding", t); System.err.println("Error reseeding: " + t);
_log.error("Error reseeding", t);
errors++;
} finally { } finally {
if (contentRaw != null) if (contentRaw != null)
contentRaw.delete(); contentRaw.delete();

View File

@ -10,6 +10,9 @@
Classes in this package, sub-packages, and others in router.jar are Classes in this package, sub-packages, and others in router.jar are
not for use by apps, clients or plugins (except for routerconsole). not for use by apps, clients or plugins (except for routerconsole).
Subject to change. Not necessarily maintained as a stable API. Subject to change. Not necessarily maintained as a stable API.
</p><p>
For applications bundling the I2P router, instantiate Router and call runRouter(), or use Router.main() or RouterLaunch.
Most public methods in Router are maintained as a stable I2P for those bundling the router.
</p> </p>
</body> </body>
</html> </html>

View File

@ -36,9 +36,10 @@ class LocalClientManager extends ClientManager {
@Override @Override
protected void startListeners() { protected void startListeners() {
_listener = new LocalClientListenerRunner(_ctx, this, _port); ClientListenerRunner listener = new LocalClientListenerRunner(_ctx, this, _port);
Thread t = new I2PThread(_listener, "ClientListener:" + _port, true); Thread t = new I2PThread(listener, "ClientListener:" + _port, true);
t.start(); t.start();
_listeners.add(listener);
_isStarted = true; _isStarted = true;
} }