forked from I2P_Developers/i2p.i2p
propagate from branch 'i2p.i2p' (head 79d0ad4538a0adc4ced6ac26cb725abe3d5ccee3)
to branch 'i2p.i2p.zzz.test2' (head 73032545b42f6f9caffffca08d0a8b97f5cf7e3a)
This commit is contained in:
@ -1202,22 +1202,23 @@ class PeerCoordinator implements PeerListener
|
||||
boolean skipped = false;
|
||||
for(Piece piece : wantedPieces) {
|
||||
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
|
||||
// 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
|
||||
boolean nonSeeds = false;
|
||||
int nonSeeds = 0;
|
||||
for (Peer pr : peers) {
|
||||
PeerState state = pr.state;
|
||||
if (state == null) continue;
|
||||
BitField bf = state.bitfield;
|
||||
if (bf == null) continue;
|
||||
if (bf.get(savedPiece) && !pr.isCompleted()) {
|
||||
nonSeeds = true;
|
||||
if (++nonSeeds > 1)
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (nonSeeds) {
|
||||
if (nonSeeds > 1) {
|
||||
skipped = true;
|
||||
break;
|
||||
}
|
||||
|
@ -671,9 +671,9 @@ public class PluginStarter implements Runnable {
|
||||
for(ClientAppConfig app : apps) {
|
||||
// If the client is a running ClientApp that we want to stop,
|
||||
// bypass all the logic below.
|
||||
if (action.equals("stop")) {
|
||||
ClientApp ca = ctx.routerAppManager().getClientApp(app.className, LoadClientAppsJob.parseArgs(app.args));
|
||||
if (ca != null && ca.getState() == ClientAppState.RUNNING) {
|
||||
if (action.equals("stop")) {
|
||||
try {
|
||||
ca.shutdown(LoadClientAppsJob.parseArgs(app.stopargs));
|
||||
} catch (Throwable t) {
|
||||
|
@ -391,7 +391,11 @@ class SAMv3Handler extends SAMv1Handler
|
||||
} else if (domain.equals("NAMING")) {
|
||||
canContinue = execNamingMessage(opcode, props);
|
||||
} else if (domain.equals("DATAGRAM")) {
|
||||
// TODO not yet overridden, ID is ignored, most recent DATAGRAM session is used
|
||||
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 {
|
||||
if (_log.shouldLog(Log.DEBUG))
|
||||
_log.debug("Unrecognized message domain: \""
|
||||
@ -694,10 +698,10 @@ class SAMv3Handler extends SAMv1Handler
|
||||
else
|
||||
{
|
||||
if (_log.shouldLog(Log.DEBUG))
|
||||
_log.debug ( "Unrecognized RAW message opcode: \""
|
||||
_log.debug ( "Unrecognized STREAM message opcode: \""
|
||||
+ opcode + "\"" );
|
||||
try {
|
||||
notifyStreamResult(true, "I2P_ERROR", "Unrecognized RAW message opcode: "+opcode );
|
||||
notifyStreamResult(true, "I2P_ERROR", "Unrecognized STREAM message opcode: "+opcode );
|
||||
} catch (IOException e) {}
|
||||
return false;
|
||||
}
|
||||
@ -716,9 +720,9 @@ class SAMv3Handler extends SAMv1Handler
|
||||
|
||||
String dest = props.getProperty("DESTINATION");
|
||||
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))
|
||||
_log.debug("Destination not specified in RAW SEND message");
|
||||
_log.debug("Destination not specified in STREAM CONNECT message");
|
||||
return false;
|
||||
}
|
||||
props.remove("DESTINATION");
|
||||
|
@ -44,6 +44,7 @@ class PacketQueue implements SendMessageStatusListener {
|
||||
private static final int FINAL_TAGS_TO_SEND = 4;
|
||||
private static final int FINAL_TAG_THRESHOLD = 2;
|
||||
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) {
|
||||
_context = context;
|
||||
@ -134,7 +135,7 @@ class PacketQueue implements SendMessageStatusListener {
|
||||
if (con != null) {
|
||||
if (con.isInbound())
|
||||
options.setSendLeaseSet(false);
|
||||
else
|
||||
else if (ENABLE_STATUS_LISTEN)
|
||||
listenForStatus = true;
|
||||
}
|
||||
options.setTagsToSend(INITIAL_TAGS_TO_SEND);
|
||||
|
@ -614,7 +614,7 @@ public class WebMail extends HttpServlet
|
||||
}
|
||||
catch (Exception e1) {
|
||||
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 )
|
||||
|
45
core/java/src/net/i2p/client/DomainSocketFactory.java
Normal file
45
core/java/src/net/i2p/client/DomainSocketFactory.java
Normal 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();
|
||||
}
|
||||
}
|
@ -52,6 +52,7 @@ import net.i2p.util.LHMCache;
|
||||
import net.i2p.util.Log;
|
||||
import net.i2p.util.OrderedProperties;
|
||||
import net.i2p.util.SimpleTimer2;
|
||||
import net.i2p.util.SystemVersion;
|
||||
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_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 MAX_SEND_WAIT = 10*1000;
|
||||
@ -279,6 +286,10 @@ abstract class I2PSessionImpl implements I2PSession, I2CPMessageReader.I2CPMessa
|
||||
if (_context.isRouterContext())
|
||||
// just for logging
|
||||
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");
|
||||
}
|
||||
|
||||
@ -287,7 +298,9 @@ abstract class I2PSessionImpl implements I2PSession, I2CPMessageReader.I2CPMessa
|
||||
* @since 0.9.7 was in loadConfig()
|
||||
*/
|
||||
private int getPort() {
|
||||
if (_context.isRouterContext())
|
||||
if (_context.isRouterContext() ||
|
||||
(SystemVersion.isAndroid() &&
|
||||
Boolean.parseBoolean(_options.getProperty(PROP_DOMAIN_SOCKET))))
|
||||
// just for logging
|
||||
return 0;
|
||||
String portNum = _options.getProperty(I2PClient.PROP_TCP_PORT, LISTEN_PORT + "");
|
||||
@ -447,7 +460,7 @@ abstract class I2PSessionImpl implements I2PSession, I2CPMessageReader.I2CPMessa
|
||||
try {
|
||||
// protect w/ closeSocket()
|
||||
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()) {
|
||||
// _socket and _writer remain null
|
||||
InternalClientManager mgr = _context.internalClientManager();
|
||||
@ -457,7 +470,11 @@ abstract class I2PSessionImpl implements I2PSession, I2CPMessageReader.I2CPMessa
|
||||
_queue = mgr.connect();
|
||||
_reader = new QueuedI2CPMessageReader(_queue, this);
|
||||
} 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 {
|
||||
I2PSSLSocketFactory fact = new I2PSSLSocketFactory(_context, false, "certificates/i2cp");
|
||||
_socket = fact.createSocket(_hostname, _portNum);
|
||||
|
@ -19,6 +19,7 @@ import net.i2p.data.DataFormatException;
|
||||
import net.i2p.data.Destination;
|
||||
import net.i2p.data.Hash;
|
||||
import net.i2p.data.Signature;
|
||||
import net.i2p.data.SigningPublicKey;
|
||||
import net.i2p.util.Log;
|
||||
|
||||
/**
|
||||
@ -34,16 +35,11 @@ public final class I2PDatagramDissector {
|
||||
private final DSAEngine dsaEng = DSAEngine.getInstance();
|
||||
private final SHA256Generator hashGen = SHA256Generator.getInstance();
|
||||
|
||||
private Hash rxHash;
|
||||
|
||||
private byte[] rxHash;
|
||||
private Signature rxSign;
|
||||
|
||||
private Destination rxDest;
|
||||
|
||||
private final byte[] rxPayload = new byte[DGRAM_BUFSIZE];
|
||||
|
||||
private int rxPayloadLen;
|
||||
|
||||
private boolean valid;
|
||||
|
||||
/**
|
||||
@ -56,6 +52,17 @@ public final class I2PDatagramDissector {
|
||||
* Load an I2P repliable datagram into the dissector.
|
||||
* 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
|
||||
*
|
||||
* @throws DataFormatException If there's an error in the datagram format
|
||||
@ -79,14 +86,21 @@ public final class I2PDatagramDissector {
|
||||
rxPayloadLen = dgStream.read(rxPayload);
|
||||
|
||||
// calculate the hash of the payload
|
||||
this.rxHash = hashGen.calculateHash(rxPayload, 0, rxPayloadLen);
|
||||
assert this.hashGen.calculateHash(this.extractPayload()).equals(this.rxHash);
|
||||
if (type == SigType.DSA_SHA1) {
|
||||
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) {
|
||||
Log log = I2PAppContext.getGlobalContext().logManager().getLog(I2PDatagramDissector.class);
|
||||
log.error("Caught IOException - INCONSISTENT STATE!", e);
|
||||
} catch(AssertionError e) {
|
||||
Log log = I2PAppContext.getGlobalContext().logManager().getLog(I2PDatagramDissector.class);
|
||||
log.error("Assertion failed!", e);
|
||||
//} catch(AssertionError e) {
|
||||
// Log log = I2PAppContext.getGlobalContext().logManager().getLog(I2PDatagramDissector.class);
|
||||
// log.error("Assertion failed!", e);
|
||||
}
|
||||
|
||||
//_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
|
||||
* loaded with the loadI2PDatagram() method), verifying the datagram
|
||||
* 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
|
||||
* @throws I2PInvalidDatagramException if the signature verification fails
|
||||
*/
|
||||
public Hash getHash() throws I2PInvalidDatagramException {
|
||||
// make sure it has a valid signature
|
||||
this.verifySignature();
|
||||
|
||||
return this.extractHash();
|
||||
return extractHash();
|
||||
}
|
||||
|
||||
/**
|
||||
@ -178,10 +194,18 @@ public final class I2PDatagramDissector {
|
||||
* Extract the hash of the payload of an I2P repliable datagram (previously
|
||||
* loaded with the loadI2PDatagram() method), without verifying the datagram
|
||||
* 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
|
||||
*/
|
||||
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)
|
||||
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");
|
||||
|
||||
// now validate
|
||||
if (!this.dsaEng.verifySignature(rxSign, rxHash.getData(), rxDest.getSigningPublicKey()))
|
||||
SigningPublicKey spk = rxDest.getSigningPublicKey();
|
||||
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
|
||||
this.valid = true;
|
||||
|
@ -16,8 +16,12 @@ import net.i2p.client.I2PSession;
|
||||
import net.i2p.crypto.DSAEngine;
|
||||
import net.i2p.crypto.SHA256Generator;
|
||||
import net.i2p.data.DataFormatException;
|
||||
import net.i2p.data.Hash;
|
||||
import net.i2p.data.Signature;
|
||||
import net.i2p.data.SigningPrivateKey;
|
||||
import net.i2p.crypto.SigType;
|
||||
import net.i2p.util.Log;
|
||||
import net.i2p.util.SimpleByteCache;
|
||||
|
||||
/**
|
||||
* 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
|
||||
*/
|
||||
public I2PDatagramMaker(I2PSession session) {
|
||||
this();
|
||||
this.setI2PDatagramMaker(session);
|
||||
}
|
||||
|
||||
/**
|
||||
* Construct a new I2PDatagramMaker that is null.
|
||||
* Use setI2PDatagramMaker to set the parameters.
|
||||
@ -59,22 +63,53 @@ public final class I2PDatagramMaker {
|
||||
sxPrivKey = session.getPrivateKey();
|
||||
sxDestBytes = session.getMyDestination().toByteArray();
|
||||
}
|
||||
|
||||
/**
|
||||
* 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.
|
||||
* @return null on error
|
||||
* @throws IllegalArgumentException if payload is too big
|
||||
* @throws IllegalStateException if Destination signature type unsupported
|
||||
*/
|
||||
public byte[] makeI2PDatagram(byte[] payload) {
|
||||
sxDGram.reset();
|
||||
|
||||
try {
|
||||
sxDGram.write(sxDestBytes);
|
||||
SigType type = sxPrivKey.getType();
|
||||
if (type == null)
|
||||
throw new IllegalStateException("Unsupported sig type");
|
||||
|
||||
dsaEng.sign(hashGen.calculateHash(payload).toByteArray(),
|
||||
sxPrivKey).writeBytes(sxDGram);
|
||||
|
||||
Signature sig;
|
||||
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);
|
||||
|
||||
if (sxDGram.size() > DGRAM_BUFSIZE)
|
||||
throw new IllegalArgumentException("Too big");
|
||||
return sxDGram.toByteArray();
|
||||
} catch (IOException e) {
|
||||
Log log = I2PAppContext.getGlobalContext().logManager().getLog(I2PDatagramMaker.class);
|
||||
|
@ -10,6 +10,9 @@ in turn, use the {@link net.i2p.client.datagram.I2PDatagramMaker} to build a
|
||||
message that can be parsed. </p>
|
||||
|
||||
<p>The datagram format implemented here includes
|
||||
the sender's {@link net.i2p.data.Destination}, the payload, and a hash of the
|
||||
payload (signed by the sender's {@link net.i2p.data.SigningPrivateKey}).</p>
|
||||
the sender's {@link net.i2p.data.Destination}, the payload, and a signature
|
||||
(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>
|
||||
|
@ -18,6 +18,7 @@ import net.i2p.I2PAppContext;
|
||||
import net.i2p.data.Base64;
|
||||
import net.i2p.util.Log;
|
||||
import net.i2p.util.SecureFileOutputStream;
|
||||
import net.i2p.util.SystemVersion;
|
||||
|
||||
/**
|
||||
* 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"
|
||||
* @return value or null if not found
|
||||
*/
|
||||
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);
|
||||
X500Principal p = cert.getSubjectX500Principal();
|
||||
String subj = p.getName();
|
||||
|
@ -14,9 +14,11 @@ import java.security.PublicKey;
|
||||
import java.security.cert.CertificateFactory;
|
||||
import java.security.cert.X509Certificate;
|
||||
|
||||
import net.i2p.util.SystemVersion;
|
||||
|
||||
/**
|
||||
* Dumb storage in a directory for testing.
|
||||
* No sanitization of filenames, unsafe.
|
||||
* Simple storage of each cert in a separate file in a directory.
|
||||
* Limited sanitization of filenames.
|
||||
*
|
||||
* @since 0.9.9
|
||||
*/
|
||||
@ -30,7 +32,9 @@ class DirKeyRing implements KeyRing {
|
||||
|
||||
/**
|
||||
* 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)
|
||||
throws GeneralSecurityException, IOException {
|
||||
@ -49,14 +53,21 @@ class DirKeyRing implements KeyRing {
|
||||
CertificateFactory cf = CertificateFactory.getInstance("X.509");
|
||||
X509Certificate cert = (X509Certificate)cf.generateCertificate(fis);
|
||||
cert.checkValidity();
|
||||
if (!SystemVersion.isAndroid()) {
|
||||
// getSubjectValue() unsupported on Android.
|
||||
// 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();
|
||||
} finally {
|
||||
try { if (fis != null) fis.close(); } catch (IOException foo) {}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Unimplemented, unused.
|
||||
*/
|
||||
public void setKey(String keyName, String scope, PublicKey key) {}
|
||||
}
|
||||
|
@ -29,7 +29,7 @@ public class SessionKeyManager {
|
||||
|
||||
/**
|
||||
* A dummy SessionKeyManager for testing or for passing to
|
||||
* ElGamalAESEngine.encrypt()
|
||||
* ElGamalAESEngine.decrypt()
|
||||
*
|
||||
* @since 0.9.14
|
||||
*/
|
||||
@ -37,7 +37,7 @@ public class SessionKeyManager {
|
||||
|
||||
/**
|
||||
* A dummy SessionKeyManager for testing or for passing to
|
||||
* ElGamalAESEngine.encrypt()
|
||||
* ElGamalAESEngine.decrypt()
|
||||
*
|
||||
* @param context unused
|
||||
* @since public since 0.9.14; protected before that
|
||||
|
15
history.txt
15
history.txt
@ -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
|
||||
* Base64:
|
||||
- Catch numerous decoding errors that were previously misdecoded (ticket #1318)
|
||||
|
@ -0,0 +1,32 @@
|
||||
-----BEGIN CERTIFICATE-----
|
||||
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
|
||||
fss8T6gOo19esb/KEMZGZE4pAApakWM=
|
||||
-----END CERTIFICATE-----
|
@ -0,0 +1,32 @@
|
||||
-----BEGIN CERTIFICATE-----
|
||||
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
|
||||
WX89Xn2UyQf5kHifiDKL
|
||||
-----END CERTIFICATE-----
|
@ -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
|
||||
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
|
||||
mtn.i2p-projekt.i2p=I6Ha4I7rgR0JyExQnN~4sZz5CfRqdN7o-2t1i2YOExd2CxC4MHHz3nJ5KgBIqeNa0dZbugwMEYMWneXAf8nuy9RKUrjcDvGLqScuU8QCpG-e7UDR8lNregfaOwTuypBQiPh9nrc86Zc2JXyTv0eG3T5Yl1tydqs3qEz5w1vn64uRCrGLEMsnGMIZ4aXexseL6McW9ObIQ0qOIfRG9kc~3~bpD9UM4G04BXPZ1Ao5MUjGoQyxlaNCt1DrvAYcrRArzvv0QGyPjb6HpHLlK2UIoR6SumRuNYpEXCaqbXEnEicx1kB5Pyhcwm0cyaMCx-ZaUU-F1~23VurE41xNMbq4GwXtev4bVP4ycHGHjH-XYJmKrqnesIEp7InSAWfm0gdDHuy9377nSIyAhGLLFlWKtzrZPiKm57SN4~BZSQIF6CI4JutGa0x9EaO8hvzFgaYKgwS~a7-YuZNfx4VHEF2J34DrsJo4qetdPTWTKX1o-ztMP6f7DpWjp4JTKb36YstvAAAA
|
||||
|
@ -57,13 +57,13 @@ tunnel.1.option.outbound.priority=15
|
||||
tunnel.1.startOnLoad=true
|
||||
|
||||
# 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.type=client
|
||||
tunnel.2.sharedClient=true
|
||||
tunnel.2.interface=127.0.0.1
|
||||
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.i2cpPort=7654
|
||||
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.reduceOnIdle=true
|
||||
tunnel.4.option.i2cp.reduceQuantity=1
|
||||
tunnel.4.option.i2p.streaming.connectDelay=1000
|
||||
tunnel.4.option.inbound.length=3
|
||||
tunnel.4.option.inbound.lengthVariance=0
|
||||
tunnel.4.option.outbound.length=3
|
||||
|
@ -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>")
|
||||
</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>
|
||||
_("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>")
|
||||
|
@ -1,109 +1,96 @@
|
||||
<div lang="fr">
|
||||
<ul class="links"><li class="tidylist"><b>Démarrage…</b><br>Si vous venez juste de lancer I2P, le nombre de
|
||||
<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 et vous verrez alors en bas du panneau une <i>destination locale</i>
|
||||
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>
|
||||
<ul class="links"><li class="tidylist"><b>Démarrage…</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
|
||||
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
|
||||
<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>
|
||||
|
||||
<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
|
||||
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 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
|
||||
<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
|
||||
dessus de la section <i>Destinations locales</i> dans le panneau de contrôle), 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
|
||||
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>
|
||||
|
||||
<h3>Les services sur I2P</h3>
|
||||
<ul class="links">
|
||||
|
||||
<li class="tidylist"><b>Internet invisible & 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…), et
|
||||
vous pouvez aussi héberger vos propres services anonyme. Vous avez également un accès anonyme au web normal via le
|
||||
serveur mandataire sortant ("outproxy") I2P intégré. Pour ceci,
|
||||
<a href="https://geti2p.net/fr/about/browser-config" target="_blank">configurez votre navigateur</a> pour qu'il utilise le
|
||||
vous pouvez aussi héberger vos propres services. Vous pouvez également accéder au web anonymement via le
|
||||
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> 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
|
||||
(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
|
||||
<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
|
||||
par le <a href="/webmail">client de messagerie I2P intégré</a> dans la console du routeur (susimail), soit en
|
||||
configurant n'importe quel logiciel client de messagerie compatible SMTP et POP3. Les comptes peuvent recevoir et
|
||||
envoyer du courrier de/vers l'Internet normal. Créez au moins votre compte sur
|
||||
<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> (susimail) dans la console du routeur, soit en
|
||||
configurant n'importe quel logiciel client de messagerie compatible SMTP et POP3. Les comptes peuvent envoyer et
|
||||
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://i2pbote.i2p/" target="_blank">I2P-Bote</a> est le nouveau système 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
|
||||
carnet d'adresses intégré. Développé par HungryHobo, il s'installe en tant que <a href="#plugins">greffon</a>.</li>
|
||||
<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 anonyme/pseudonyme, disposant d'une interface web et d'un
|
||||
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
|
||||
intégré dans le router I2P. Il permet les transferts anonymes et cryptés
|
||||
<a href="https://secure.wikimedia.org/wikipedia/fr/wiki/BitTorrent_%28protocole%29" target="_blank">BitTorrent</a>.
|
||||
Sponge a développé en Python un autre client bittorrent appelé <a href="http://bob.i2p/Robert.html">Robert</a>.
|
||||
Il y a aussi un portage d'<a href="http://www.emule-project.net/" target="_blank">eMule/aMule</a> sur I2P:…
|
||||
<a href="http://echelon.i2p/imule/">iMule</a> [Cherche développeurs!], une implémentation anonyme et sécurisée d'un
|
||||
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.
|
||||
Sponge a développé un autre client bittorrent appelé <a href="http://bob.i2p/Robert.html">Robert</a> écrit en Python.
|
||||
Il existe aussi un portage d'<a href="http://www.emule-project.net/" target="_blank">eMule/aMule</a> sur I2P appelé
|
||||
<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="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
|
||||
développeurs!], ainsi que d'autres utilitaires dont un hébergement de fichiers basé sur le 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.
|
||||
Chatzilla, Pidgin, XChat, etc…) et connectez-vous au <a href="irc://127.0.0.1:6668/i2p">serveur</a> sur
|
||||
développeurs !], ainsi que d'autres utilitaires dont l'hébergement de fichiers basé sur navigateur.</li>
|
||||
<li class="tidylist"><b>Tchat anonyme</b><br>Lancez votre logiciel client IRC (p.e.
|
||||
Chatzilla, Pidgin, XChat, etc…) 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
|
||||
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
|
||||
ni vous ni eux ne sauront où se trouve l'autre, et ni ta maman ni ton gouvernement ne sera capable d'intercepter ta
|
||||
conversation!… (sauf,… heu… regarde quand même dans ton dos!…ET dans le faux plafond ET dis
|
||||
à ton correspondant d'en faire autant… ET coulez vos PC dans du béton). Une fois là, /join
|
||||
<code>#i2p-chat</code>, <code>#i2p</code>, <code>#i2p-chat</code> ou <code>#i2p-dev</code>
|
||||
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
|
||||
couenne d'endive.</délire> Il y a aussi une
|
||||
<a href="http://echelon.i2p/qti2pmessenger/">messagerie instantanée</a> à la sauce I2P pour le claviotage anonyme
|
||||
(tiens, le rev'là) non surveillable et non censurable, ainsi que d'autres serveurs IRC, Jabber, website-based chat,
|
||||
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
|
||||
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 !. Une fois là-bas, /join
|
||||
<code>#i2p-help</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
|
||||
<a href="http://echelon.i2p/qti2pmessenger/">messagerie instantanée</a> basée-I2P, permettant de faire du tchat anonyme
|
||||
non surveillable et non censurable, ainsi que d'autres serveurs IRC alternatifs, serveurs Jabber, tchat basé-site-web,
|
||||
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
|
||||
vous plaisent, 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="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>
|
||||
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>
|
||||
<li class="tidylist"><b>Forums & 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
|
||||
forum et blog pour I2P [Nids de développeurs! (prononcez à l'anglaise)].
|
||||
Bien entendu, tous les logiciels 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
|
||||
configurez et de 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>
|
||||
être intéressé par <a href="http://syndie.i2p2.de/" target="_blank">Syndie</a>, qui est une plateforme décentralisée de
|
||||
forums et blogs pour I2P [Besoin de développeurs !].
|
||||
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
|
||||
configurez, et tenir tous les logiciels associés (p.e. Php, MySql, Python, Apache) bien à jour et verrouillés !
|
||||
Aussi, vous trouverez dans I2P quelques forums communautaires dans diverses langues : voir <a href="#eepsites">plus bas</a>
|
||||
d'autres suggestions.</li>
|
||||
<li class="tidylist"><a name="plugins"></a><b>Greffons pour I2P</b><br>Étendez l'usage et la portée d'I2P en
|
||||
installant des greffons… blog, chat, partage de fichiers et autres 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>!
|
||||
Consultez la carte (et les secrets du chef) 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
|
||||
environnement d'écriture de greffons indépendant de tout langage dans la
|
||||
<a href="http://i2p-projekt.i2p/fr/docs/plugins" target="_blank">documentation</a>; les greffons I2P peuvent être codés dans
|
||||
<li class="tidylist"><a name="plugins"></a><b>Greffons pour I2P</b><br>Étendez l'utilité d'I2P en
|
||||
installant des greffons… blog, tchat, partage de fichiers et autres greffons sont déjà écrits ou portés, et n'attendent
|
||||
que votre <a href="http://plugins.i2p/plugins/" target="_blank">installation</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 pourrez disposer d'un
|
||||
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 d'I2P peuvent être programmés dans
|
||||
n'importe quel langage.</li>
|
||||
</ul>
|
||||
|
||||
<h3>Hébergement crypté anonyme sur I2P</h3>
|
||||
<h3>Hébergement web anonyme crypté sur I2P</h3>
|
||||
<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
|
||||
anonyme (eepsite) sur le réseau I2P: une instance <a href="http://jetty.mortbay.org/" target="_blank">Jetty</a> qui
|
||||
<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 : 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
|
||||
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
|
||||
<code>eepsite/cgi-bin</code>) et ils s'afficheront. Vous gardez tout loisir de choisir le serveur web qui vous convient
|
||||
pour fonctionner sur I2P et remplacer le serveur intégré, ou exécuter celui-ci sur un autre tunnel.</li>
|
||||
<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>
|
||||
<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
|
||||
visible (mais pas encore découvrable) par les I2P'nautes. 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 à
|
||||
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 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 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>
|
||||
|
||||
<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">
|
||||
<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> sont les adresses de connexions sécurisées et
|
||||
anonymes des sites classiques <a href="https://geti2p.net/" target="_blank">www.i2p2.de</a> et
|
||||
<a href="http://geti2p.net/" target="_blank">geti2p.net</a>. Si vous êtes curieux du fonctionnement d'I2P et de la
|
||||
façon d'y contribuer, vous venez de trouver la porte d'entrée.</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>
|
||||
<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
|
||||
façon d'y contribuer, ceci est la première porte d'entrée.</li>
|
||||
<li class="tidylist"><b>Forums de la communauté I2P</b><br>
|
||||
<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>Pastebin anonyme I2P</b><br>
|
||||
<a href="http://pastethis.i2p/" target="_blank">pastethis.i2p</a>: service de collage sécurisé et anonyme pour le
|
||||
partage de texte et de code au format textuel sur I2P.</li>
|
||||
<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,
|
||||
I2P-Messenger…) 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,
|
||||
les pré-versions d'I2P à essayer.</li>
|
||||
<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 via I2P.</li>
|
||||
<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 avec leurs code sources (quand cela est permis), informations concernant 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
|
||||
des 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
|
||||
ouvert et anonyme sur lequel chacun peut modifier toute sorte d'informations sur I2P, l'aide pour les débutants,
|
||||
des liens supplémentaires dans le réseau, etc…</li>
|
||||
ouvert et anonyme dans lequel chacun peut modifier toutes sortes d'informations concernant I2P, aide pour les débutants,
|
||||
liens supplémentaires dans le réseau, et plus.</li>
|
||||
<li class="tidylist"><b>The Planet (sur I2P)</b><br><a href="http://planet.i2p/" target="_blank">planet.i2p</a> :
|
||||
un site agrégateur RSS qui collecte les nouvelles et évènements concernant I2P et les publie toutes regroupée en un
|
||||
seul endroit. Un bon aperçu de la communauté au travail!</li>
|
||||
<li class="tidylist"><b>Moteur de recherches eepsites</b><br>
|
||||
<a href="http://eepsites.i2p/" target="_blank">eepsites.i2p</a>: moteur de recherches sur les contenus I2P hébergé
|
||||
un site web 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>
|
||||
<li class="tidylist"><b>Moteur de recherches d'eepsites</b><br>
|
||||
<a href="http://eepsites.i2p/" target="_blank">eepsites.i2p</a> : moteur de recherche d'eepsites hébergé
|
||||
anonymement.</li>
|
||||
<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
|
||||
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>
|
||||
</ul>
|
||||
|
||||
|
||||
<h2><a name="trouble"></a>Résolution de problèmes & assistance supplémentaire</h2>
|
||||
<h2><a name="trouble"></a>Résolution de problèmes et assistance supplémentaire</h2>
|
||||
|
||||
<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
|
||||
lancez car il s'amorce en découvrant des pairs supplémentaires. Plus il tourne 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
|
||||
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 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
|
||||
inférieur à 5, voici ce que vous pouvez faire pour trouver l'origine du problème :
|
||||
</li>
|
||||
|
||||
<li class="tidylist"><b>Vérifiez votre configuration & allocation de bande passante</b><br>I2P fonctionne au mieux
|
||||
quand vous reflétez correctement la vitesse de votre connexion Internet dans la section
|
||||
<li class="tidylist"><b>Vérifiez votre configuration et votre allocation de bande passante</b><br>I2P fonctionne mieux
|
||||
lorsque vous indiquez exactement la vitesse de votre connexion Internet dans la section
|
||||
<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
|
||||
prendre le temps d'adapter ces valeurs à votre cas particulier. Plus vous allouez de bande passante, <i>en particulier
|
||||
la bande passante sortante</i>, plus vous obtiendrez de bonnes performances.</li>
|
||||
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. D'autre part plus vous allouez de bande passante, <i>en particulier
|
||||
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 & 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
|
||||
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
|
||||
sortant non restrictif, I2P peut quand même fonctionner: vous pouvez désactiver les accès entrants et vous reposer sur
|
||||
<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/pare-feu
|
||||
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 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>
|
||||
(<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".
|
||||
Pour obtenir des performances optimales, préférez si possible de donnez accès à I2P l'accès à un
|
||||
<b><a href="/config">port externe</a> visible depuis Internet</b>.<br />
|
||||
Pendant l'installation, I2P choisit aléatoirement ce port <a href="http://127.0.0.1:7657/config">modifiable ici</a>.
|
||||
Vous pouvez laisser ce port ou en choisir un autre, et quel que soit votre choix régler vos pare-feux en conséquence.
|
||||
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, lorsque c'est possible veuillez vous assurer que le
|
||||
<b><a href="/config">port externe</a></b> d'I2P soit visible depuis Internet (lire ci-dessous pour davantage d'informations).<br />
|
||||
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.
|
||||
<br />
|
||||
Voir plus bas pour d'autres solutions.
|
||||
</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
|
||||
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
|
||||
<a href="http://i2p-projekt.i2p/fr/about/browser-config" target="_blank">guide</a> de configuration du navigateur pour
|
||||
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 à
|
||||
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://pastethis.i2p/" target="_blank">coller ici</a> et faire référence au lien sur le canal IRC #i2p-fr
|
||||
(Freenode).
|
||||
<a href="http://pastethis.i2p/" target="_blank">coller ici</a> et demander de l'aide sur IRC en faisant référence à ce lien.
|
||||
</li>
|
||||
|
||||
<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
|
||||
(<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 vos <a href="/logs">historiques</a>. Si vous êtes un développeur,
|
||||
(<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,
|
||||
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.
|
||||
</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
|
||||
<a href="https://secure.wikimedia.org/wikipedia/en/wiki/Universal_Plug_and_Play" target="_blank">Universal Plug
|
||||
& Play</a> (UPnP) qui permet le transfert de ports automatique. 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
|
||||
éventuellement dans votre ordinateur. Maintenant, <a href="/">redémarrez le routeur I2P</a>. Si ça marche, le panneau
|
||||
de surveillance devrait alors indiquer "Réseau: OK" une fois que le routeur I2P aura terminé ses tests de connectivité.
|
||||
& Play</a> (UPnP), lequel permet le transfert de ports automatiquement. Vérifiez que le support UPnP pour I2P est activé
|
||||
dans la <a href="/config">page de configuration</a>, puis essayez d'activer UPnP dans votre modem/routeur et
|
||||
éventuellement aussi dans votre ordinateur. Maintenant, <a href="/">redémarrez le routeur I2P</a>. Si cela marche, le panneau
|
||||
de contrôle devrait alors indiquer "Réseau: OK" une fois que le routeur I2P aura terminé ses tests de connectivité.
|
||||
</li>
|
||||
|
||||
<li class="tidylist"><b>Redirection de ports</b><br>Ouvrez le <a href="/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
|
||||
façon de s'y prendre pour divers matériels est accessible sur
|
||||
<a href="http://portforward.com/" target="_blank">portforward.com</a>, avec 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
|
||||
bienvenus!], bien qui vous puissiez vous connecter à des mandataires via I2P lui-même quand il connecté au réseau</li>
|
||||
<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 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 avec divers matériels sont accessibles sur
|
||||
<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 [améliorations
|
||||
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
|
||||
<a href="http://i2p-projekt.i2p/" target="_blank">site web I2P</a>, poster des messages sur le
|
||||
<a href="http://forum.i2p/" target="_blank">forum de discussion I2P</a>, ou louvoyer sur les canaux IRC
|
||||
<a href="irc://127.0.0.1:6668/i2p">#i2p</a> ou encore
|
||||
<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
|
||||
<code>irc.dg.i2p</code>). Ces canaux sont aussi accessibles de façon non cryptée en dehors du réseau anonyme
|
||||
via le serveur IRC <a href="irc://irc.freenode.net/i2p">Freenode</a>.
|
||||
<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 aller sur les canaux IRC
|
||||
<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
|
||||
<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
|
||||
<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 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://zzz.i2p/" target="_blank">fora de développeurs de zzz</a> ou sur 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="http://killyourtv.i2p/viewmtn/" target="_blank">l'explorateur du dépôt de kytv</a> ou par
|
||||
<a href="https://github.com/i2p/i2p.i2p" target="_blank">Github</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://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> sur le réseau IRC. Les développeurs peuvent consulter les sources sur
|
||||
<a href="http://killyourtv.i2p/viewmtn/" target="_blank">l'explorateur de dépôt mtn hébergé par Kytv</a> ou sur
|
||||
<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 nos codes sources.
|
||||
</li>
|
||||
|
||||
<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
|
||||
<a href="http://i2p-projekt.i2p/fr/get-involved/donate" target="_blank">dons</a>. Ils sont essentiellement affectés aux coûts
|
||||
administratifs et d'hébergements. Nous avons un système de
|
||||
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 frais
|
||||
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
|
||||
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-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,
|
||||
alors en parler simplement à l'apéro avec vos amis au lieu de vous étriper pour savoir si le PSG est plus tafiole
|
||||
que l'OM n'est tarlouze, (et tendre la main à votre pire ennemi pour l'installation et les réglages chaque fois que
|
||||
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.
|
||||
<a href="http://i2p-projekt.i2p/fr/get-involved/guides/new-translators" target="_blank">traducteurs</a>, de prescripteurs, et
|
||||
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 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
|
||||
la page "<a href="http://i2p-projekt.i2p/fr/get-involved" target="_blank">Impliquez-vous!</a>" du site web.
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
|
||||
<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>
|
||||
|
@ -18,7 +18,7 @@ public class RouterVersion {
|
||||
/** deprecated */
|
||||
public final static String ID = "Monotone";
|
||||
public final static String VERSION = CoreVersion.VERSION;
|
||||
public final static long BUILD = 14;
|
||||
public final static long BUILD = 19;
|
||||
|
||||
/** for example "-test" */
|
||||
public final static String EXTRA = "";
|
||||
|
@ -65,6 +65,8 @@ class ClientListenerRunner implements Runnable {
|
||||
}
|
||||
}
|
||||
|
||||
public void run() { runServer(); }
|
||||
|
||||
/**
|
||||
* Start up the socket listener, listens for connections, and
|
||||
* fires those connections off via {@link #runConnection runConnection}.
|
||||
@ -72,7 +74,7 @@ class ClientListenerRunner implements Runnable {
|
||||
* failure.
|
||||
*
|
||||
*/
|
||||
public void runServer() {
|
||||
protected void runServer() {
|
||||
_running = true;
|
||||
int curDelay = 1000;
|
||||
while (_running) {
|
||||
@ -173,5 +175,4 @@ class ClientListenerRunner implements Runnable {
|
||||
_socket = null;
|
||||
} catch (IOException ioe) {}
|
||||
}
|
||||
public void run() { runServer(); }
|
||||
}
|
||||
|
@ -10,8 +10,10 @@ package net.i2p.router.client;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.Writer;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.concurrent.LinkedBlockingQueue;
|
||||
@ -37,6 +39,7 @@ import net.i2p.router.JobImpl;
|
||||
import net.i2p.router.RouterContext;
|
||||
import net.i2p.util.I2PThread;
|
||||
import net.i2p.util.Log;
|
||||
import net.i2p.util.SystemVersion;
|
||||
|
||||
/**
|
||||
* Coordinate connections and various tasks
|
||||
@ -45,7 +48,7 @@ import net.i2p.util.Log;
|
||||
*/
|
||||
class ClientManager {
|
||||
private final Log _log;
|
||||
protected ClientListenerRunner _listener;
|
||||
protected final List<ClientListenerRunner> _listeners;
|
||||
// Destination --> ClientConnectionRunner
|
||||
// Locked for adds/removes but not lookups
|
||||
private final Map<Destination, ClientConnectionRunner> _runners;
|
||||
@ -87,6 +90,7 @@ class ClientManager {
|
||||
// "How large are messages received by the client?",
|
||||
// "ClientMessages",
|
||||
// new long[] { 60*1000l, 60*60*1000l, 24*60*60*1000l });
|
||||
_listeners = new ArrayList<ClientListenerRunner>();
|
||||
_runners = new ConcurrentHashMap<Destination, ClientConnectionRunner>();
|
||||
_runnersByHash = new ConcurrentHashMap<Hash, ClientConnectionRunner>();
|
||||
_pendingRunners = new HashSet<ClientConnectionRunner>();
|
||||
@ -105,14 +109,22 @@ class ClientManager {
|
||||
|
||||
/** Todo: Start a 3rd listener for IPV6? */
|
||||
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)) {
|
||||
// there's no option to start both an SSL and non-SSL listener
|
||||
if (_ctx.getBooleanProperty(PROP_ENABLE_SSL))
|
||||
_listener = new SSLClientListenerRunner(_ctx, this, _port);
|
||||
listener = new SSLClientListenerRunner(_ctx, this, _port);
|
||||
else
|
||||
_listener = new ClientListenerRunner(_ctx, this, _port);
|
||||
Thread t = new I2PThread(_listener, "ClientListener:" + _port, true);
|
||||
listener = new ClientListenerRunner(_ctx, this, _port);
|
||||
Thread t = new I2PThread(listener, "ClientListener:" + _port, true);
|
||||
t.start();
|
||||
_listeners.add(listener);
|
||||
}
|
||||
_isStarted = true;
|
||||
}
|
||||
@ -132,8 +144,9 @@ class ClientManager {
|
||||
public synchronized void shutdown(String msg) {
|
||||
_isStarted = false;
|
||||
_log.info("Shutting down the ClientManager");
|
||||
if (_listener != null)
|
||||
_listener.stopListening();
|
||||
for (ClientListenerRunner listener : _listeners)
|
||||
listener.stopListening();
|
||||
_listeners.clear();
|
||||
Set<ClientConnectionRunner> runners = new HashSet<ClientConnectionRunner>();
|
||||
synchronized (_runners) {
|
||||
for (ClientConnectionRunner runner : _runners.values()) {
|
||||
@ -169,8 +182,13 @@ class ClientManager {
|
||||
return hisQueue;
|
||||
}
|
||||
|
||||
public boolean isAlive() {
|
||||
return _isStarted && (_listener == null || _listener.isListening());
|
||||
public synchronized boolean isAlive() {
|
||||
boolean listening = true;
|
||||
if (!_listeners.isEmpty()) {
|
||||
for (ClientListenerRunner listener : _listeners)
|
||||
listening = listening && listener.isListening();
|
||||
}
|
||||
return _isStarted && (_listeners.isEmpty() || listening);
|
||||
}
|
||||
|
||||
public void registerConnection(ClientConnectionRunner runner) {
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
@ -181,7 +181,7 @@ class SSLClientListenerRunner extends ClientListenerRunner {
|
||||
* Create (if necessary) and load the key store, then run.
|
||||
*/
|
||||
@Override
|
||||
public void runServer() {
|
||||
protected void runServer() {
|
||||
File keyStore = new File(_context.getConfigDir(), "keystore/i2cp.ks");
|
||||
if (verifyKeyStore(keyStore) && initializeFactory(keyStore)) {
|
||||
super.runServer();
|
||||
|
@ -534,7 +534,9 @@ public class Reseeder {
|
||||
break;
|
||||
}
|
||||
} catch (Throwable t) {
|
||||
_log.warn("Error reseeding", t);
|
||||
System.err.println("Error reseeding: " + t);
|
||||
_log.error("Error reseeding", t);
|
||||
errors++;
|
||||
} finally {
|
||||
if (contentRaw != null)
|
||||
contentRaw.delete();
|
||||
|
@ -10,6 +10,9 @@
|
||||
Classes in this package, sub-packages, and others in router.jar are
|
||||
not for use by apps, clients or plugins (except for routerconsole).
|
||||
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>
|
||||
</body>
|
||||
</html>
|
||||
|
@ -36,9 +36,10 @@ class LocalClientManager extends ClientManager {
|
||||
|
||||
@Override
|
||||
protected void startListeners() {
|
||||
_listener = new LocalClientListenerRunner(_ctx, this, _port);
|
||||
Thread t = new I2PThread(_listener, "ClientListener:" + _port, true);
|
||||
ClientListenerRunner listener = new LocalClientListenerRunner(_ctx, this, _port);
|
||||
Thread t = new I2PThread(listener, "ClientListener:" + _port, true);
|
||||
t.start();
|
||||
_listeners.add(listener);
|
||||
_isStarted = true;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user