propagate from branch 'i2p.i2p' (head 2b1a99ea78270f80514ced3860a7d54cc3f2e309)

to branch 'i2p.i2p.zzz.VTBM' (head 155eea7b96fa5ce48faec385242e0b6eb232b0dd)
This commit is contained in:
zzz
2010-02-01 14:39:16 +00:00
154 changed files with 8218 additions and 7624 deletions

View File

@@ -207,6 +207,9 @@ The following applications and libraries are not used or bundled in
binary packages, therefore the licenses are not included in binary
distributions. See the source package for the additional license information.
Admin Manager:
Public domain
Atalk:
Public domain

View File

@@ -256,11 +256,13 @@ public class BOB {
listener = new ServerSocket(Integer.parseInt(props.getProperty(PROP_BOB_PORT)), 10, InetAddress.getByName(props.getProperty(PROP_BOB_HOST)));
Socket server = null;
listener.setSoTimeout(500); // .5 sec
while (spin.get()) {
//DoCMDS connection;
try {
server = listener.accept();
server.setKeepAlive(true);
g = true;
} catch (ConnectException ce) {
g = false;

View File

@@ -691,6 +691,7 @@ public class DoCMDS implements Runnable {
try {
prikey = new ByteArrayOutputStream();
prikey.write(net.i2p.data.Base64.decode(Arg));
d = new Destination();
d.fromBase64(Arg);
} catch (Exception ex) {
Arg = "";

View File

@@ -102,6 +102,7 @@ public class I2PtoTCP implements Runnable {
break die;
}
sock = new Socket(host, port);
sock.setKeepAlive(true);
// make readers/writers
in = sock.getInputStream();
out = sock.getOutputStream();

View File

@@ -78,6 +78,7 @@ public class TCPlistener implements Runnable {
while (lives.get()) {
try {
server = listener.accept();
server.setKeepAlive(true);
g = true;
} catch (SocketTimeoutException ste) {
g = false;

View File

@@ -146,8 +146,14 @@ public class TCPtoI2P implements Runnable {
input = line.toLowerCase();
Destination dest = null;
if (input.endsWith(".i2p")) {
dest = I2PTunnel.destFromName(input);
line = dest.toBase64();
try {
dest = I2PTunnel.destFromName(input);
line = dest.toBase64();
} catch (NullPointerException npe) {
// Could not find the destination!?
Emsg("Can't find destination: " + input, out);
return;
}
}
dest = new Destination();
dest.fromBase64(line);

View File

@@ -561,7 +561,7 @@ public class SnarkManager implements Snark.CompleteListener {
if ( (files != null) && (files.size() > MAX_FILES_PER_TORRENT) ) {
return _("Too many files in \"{0}\" ({1}), deleting it!", info.getName(), files.size());
} else if ( (files == null) && (info.getName().endsWith(".torrent")) ) {
return _("Torrent file \"{0}\" cannot end in '.torrent', deleting it!", info.getName());
return _("Torrent file \"{0}\" cannot end in \".torrent\", deleting it!", info.getName());
} else if (info.getPieces() <= 0) {
return _("No pieces in \"{0}\", deleting it!", info.getName());
} else if (info.getPieces() > Storage.MAX_PIECES) {

View File

@@ -58,6 +58,23 @@
<Arg>webapps/i2psnark.war</Arg>
</Call>
<!-- this is so we can find the css -->
<Call name="addContext">
<Arg>
<New class="org.mortbay.http.HttpContext">
<Set name="contextPath">/themes</Set>
<Set name="resourceBase">./docs/themes</Set>
<Call name="addHandler">
<Arg>
<New class="org.mortbay.http.handler.ResourceHandler">
<Set name="redirectWelcome">FALSE</Set>
</New>
</Arg>
</Call>
</New>
</Arg>
</Call>
<!-- =============================================================== -->
<!-- Configure the Other Server Options -->
<!-- =============================================================== -->

View File

@@ -8,8 +8,8 @@ msgid ""
msgstr ""
"Project-Id-Version: I2P i2psnark\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2009-12-14 03:19+0000\n"
"PO-Revision-Date: 2009-12-20 07:03+0000\n"
"POT-Creation-Date: 2010-01-14 06:24+0000\n"
"PO-Revision-Date: 2010-01-14 06:33+0000\n"
"Last-Translator: 4get <forget@mail.i2p>\n"
"Language-Team: foo <foo@bar>\n"
"MIME-Version: 1.0\n"
@@ -141,8 +141,8 @@ msgstr "Слишком много файлов в торренте \"{0}\" ({1})
#: ../java/src/org/klomp/snark/SnarkManager.java:564
#, java-format
msgid "Torrent file \"{0}\" cannot end in '.torrent', deleting it!"
msgstr "Торрент \"{0}\" содержит единственный файл заканчивающийся на '.torrent', удаляем его!"
msgid "Torrent file \"{0}\" cannot end in \".torrent\", deleting it!"
msgstr "Торрент \"{0}\" содержит единственный файл заканчивающийся на \".torrent\", удаляем его!"
#: ../java/src/org/klomp/snark/SnarkManager.java:566
#, java-format
@@ -291,13 +291,13 @@ msgid "Torrent file {0} does not exist"
msgstr "Торрент {0} не существует"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:237
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:986
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:990
#, java-format
msgid "Torrent already running: {0}"
msgstr "Торрент уже запущен: {0}"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:239
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:988
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:992
#, java-format
msgid "Torrent already in the queue: {0}"
msgstr "Торрент уже в очереди: {0}"
@@ -414,7 +414,7 @@ msgstr "ОшибкаТрекера"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:530
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:534
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:536
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:859
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:862
msgid "peers"
msgstr "пир."
@@ -454,7 +454,7 @@ msgid "Open file"
msgstr "Открыть файл"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:579
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:779
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:781
msgid "Tracker"
msgstr "Трекер"
@@ -514,134 +514,134 @@ msgstr "Uninterested (У нас нужных этому пиру частей т
msgid "Choking (We are not allowing the peer to request pieces)"
msgstr "Choking (Мы не позволяем этому пиру запрашивать у нас части торрента)"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:742
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:743
msgid "Add Torrent"
msgstr "Добавить Торрент"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:744
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:745
msgid "From URL"
msgstr "Из URL"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:749
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:750
msgid "Add torrent"
msgstr "Добавить торрент"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:752
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:753
#, java-format
msgid "Alternately, you can copy .torrent files to the directory {0}."
msgstr "Ну или вы можете скопировать .torrent-файлы в директорию {0}."
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:754
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:755
msgid "Removing a .torrent file will cause the torrent to stop."
msgstr "Удаление .torrent-файла приведет к остановке торрента."
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:770
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:772
msgid "Create Torrent"
msgstr "Создать Торрент"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:773
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:775
msgid "Data to seed"
msgstr "Файлы для раздачи"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:777
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:779
msgid "File or directory to seed (must be within the specified path)"
msgstr "Файл или директория для раздачи (вводите только название файла или директории, указание абсолютных путей не поддерживается)"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:781
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:783
msgid "Select a tracker"
msgstr "Выбрать трекер"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:794
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:796
msgid "or"
msgstr "или"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:797
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:799
msgid "Specify custom tracker announce URL"
msgstr "Задать URL анонсера вручную"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:800
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:802
msgid "Create torrent"
msgstr "Создать торрент"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:817
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:820
msgid "Configuration"
msgstr "Настройки"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:820
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:823
msgid "Data directory"
msgstr "Директория для файлов"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:823
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:826
msgid "Directory to store torrents and data"
msgstr "Директория, где будут храниться торренты и загружаемые файлы"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:825
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:828
msgid "Edit i2psnark.config and restart to change"
msgstr "Для изменения отредактируйте файл i2psnark.config и перезагрузите I2PSnark"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:829
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:832
msgid "Auto start"
msgstr "Автозапуск"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:833
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:836
msgid "If checked, automatically start torrents that are added"
msgstr "Автоматически запускать торренты после добавления"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:856
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:859
msgid "Total uploader limit"
msgstr "Ограничение количества слотов отдачи"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:863
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:866
msgid "Up bandwidth limit"
msgstr "Ограничение скорости отдачи"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:866
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:869
msgid "Half available bandwidth recommended."
msgstr "Рекомендуется использовать половину от доступной пропускной способности."
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:868
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:871
msgid "View or change router bandwidth"
msgstr "Посмотреть/настроить ограничения скорости в маршрутизаторе I2P"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:872
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:875
msgid "Use open trackers also"
msgstr "Дополнительно использовать открытые трекеры"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:876
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:879
msgid "If checked, announce torrents to open trackers as well as the tracker listed in the torrent file"
msgstr "Анонсировать торренты на открытых трекерах, дополнительно к тем, что указаны внутри торрента"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:880
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:883
msgid "Open tracker announce URLs"
msgstr "URL открытых трекеров"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:891
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:894
msgid "I2CP host"
msgstr "Адрес I2CP"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:896
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:899
msgid "I2CP port"
msgstr "Порт I2CP"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:909
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:912
msgid "I2CP options"
msgstr "Параметры I2CP"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:914
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:917
msgid "Save configuration"
msgstr "Сохранить настройки"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:967
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:970
#, java-format
msgid "Torrent fetched from {0}"
msgstr "Получен торрент из: {0}"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:994
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:998
#, java-format
msgid "Torrent at {0} was not valid"
msgstr "Торрент полученный из {0} некорректен"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:999
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1003
#, java-format
msgid "Torrent was not retrieved from {0}"
msgstr "Не удалось получить торрент из: {0}"

View File

@@ -8,8 +8,8 @@ msgid ""
msgstr ""
"Project-Id-Version: I2P i2psnark\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2009-12-18 06:45+0000\n"
"PO-Revision-Date: 2009-12-27 10:47+0800\n"
"POT-Creation-Date: 2010-01-29 07:17+0000\n"
"PO-Revision-Date: 2010-01-29 15:30+0800\n"
"Last-Translator: walking <zhazhenzhong@gmail.com>\n"
"Language-Team: foo <foo@bar>\n"
"MIME-Version: 1.0\n"
@@ -141,8 +141,8 @@ msgstr "\"{0}\" ({1}) 含有太多文件,删除之!"
#: ../java/src/org/klomp/snark/SnarkManager.java:564
#, java-format
msgid "Torrent file \"{0}\" cannot end in '.torrent', deleting it!"
msgstr "种子文件 \"{0}\" 不以 \".torrent\"结尾,删除"
msgid "Torrent file \"{0}\" cannot end in \".torrent\", deleting it!"
msgstr "种子文件 \"{0}\" 不以 \".torrent\"结尾,正在删除!"
#: ../java/src/org/klomp/snark/SnarkManager.java:566
#, java-format

View File

@@ -1,72 +0,0 @@
/* I2PTunnel is GPL'ed (with the exception mentioned in I2PTunnel.java)
* (c) 2003 - 2004 mihi
*/
package net.i2p.i2ptunnel;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import net.i2p.util.Log;
/**
* Read what i2ptunnel logs, and expose it in a buffer
*
*/
class BufferLogger implements Logging {
private final static Log _log = new Log(BufferLogger.class);
private ByteArrayOutputStream _baos; // FIXME should be final and use a factory. FIXME
private boolean _ignore;
/**
* Constructs a buffered logger.
*/
public BufferLogger() {
_baos = new ByteArrayOutputStream(512);
_ignore = false;
}
private final static String EMPTY = "";
/**
* Retrieves the buffer
* @return the buffer
*/
public String getBuffer() {
if (_ignore)
return EMPTY;
return new String(_baos.toByteArray());
}
/**
* We don't care about anything else the logger receives. This is useful
* for loggers passed in to servers and clients, since they will continue
* to add info to the logger, but if we're instantiated by the tunnel manager,
* its likely we only care about the first few messages it sends us.
*
*/
public void ignoreFurtherActions() {
_ignore = true;
synchronized (_baos) {
_baos.reset();
}
_baos = null;
}
/**
* Pass in some random data
* @param s String containing what we're logging.
*/
public void log(String s) {
if (_ignore) return;
if (s != null) {
_log.debug("logging [" + s + "]");
try {
_baos.write(s.getBytes());
_baos.write('\n');
} catch (IOException ioe) {
_log.error("Error logging [" + s + "]");
}
}
}
}

View File

@@ -236,6 +236,8 @@ public class I2PTunnel implements Logging, EventDispatcher {
runServer(args, l);
} else if ("httpserver".equals(cmdname)) {
runHttpServer(args, l);
} else if ("httpbidirserver".equals(cmdname)) {
runHttpBidirServer(args, l);
} else if ("ircserver".equals(cmdname)) {
runIrcServer(args, l);
} else if ("textserver".equals(cmdname)) {
@@ -300,6 +302,7 @@ public class I2PTunnel implements Logging, EventDispatcher {
l.log("ping <args>");
l.log("server <host> <port> <privkeyfile>");
l.log("httpserver <host> <port> <spoofedhost> <privkeyfile>");
l.log("httpbidirserver <host> <port> <proxyport> <spoofedhost> <privkeyfile>");
l.log("textserver <host> <port> <privkey>");
l.log("genkeys <privkeyfile> [<pubkeyfile>]");
l.log("gentextkeys");
@@ -503,6 +506,80 @@ public class I2PTunnel implements Logging, EventDispatcher {
}
}
/**
* Run the HTTP server pointing at the host and port specified using the private i2p
* destination loaded from the specified file, replacing the HTTP headers
* so that the Host: specified is the one spoofed. Also runs an HTTP proxy for
* bidirectional communications on the same tunnel destination.<p />
*
* Sets the event "serverTaskId" = Integer(taskId) after the tunnel has been started (or -1 on error)
* Also sets the event "openServerResult" = "ok" or "error" (displaying "Ready!" on the logger after
* 'ok'). So, success = serverTaskId != -1 and openServerResult = ok.
*
* @param args {hostname, portNumber, proxyPortNumber, spoofedHost, privKeyFilename}
* @param l logger to receive events and output
*/
public void runHttpBidirServer(String args[], Logging l) {
if (args.length == 5) {
InetAddress serverHost = null;
int portNum = -1;
int port2Num = -1;
File privKeyFile = null;
try {
serverHost = InetAddress.getByName(args[0]);
} catch (UnknownHostException uhe) {
l.log("unknown host");
_log.error(getPrefix() + "Error resolving " + args[0], uhe);
notifyEvent("serverTaskId", Integer.valueOf(-1));
return;
}
try {
portNum = Integer.parseInt(args[1]);
} catch (NumberFormatException nfe) {
l.log("invalid port");
_log.error(getPrefix() + "Port specified is not valid: " + args[1], nfe);
notifyEvent("serverTaskId", Integer.valueOf(-1));
return;
}
try {
port2Num = Integer.parseInt(args[2]);
} catch (NumberFormatException nfe) {
l.log("invalid port");
_log.error(getPrefix() + "Port specified is not valid: " + args[2], nfe);
notifyEvent("serverTaskId", Integer.valueOf(-1));
return;
}
String spoofedHost = args[3];
privKeyFile = new File(args[4]);
if (!privKeyFile.isAbsolute())
privKeyFile = new File(_context.getConfigDir(), args[4]);
if (!privKeyFile.canRead()) {
l.log("private key file does not exist");
_log.error(getPrefix() + "Private key file does not exist or is not readable: " + args[4]);
notifyEvent("serverTaskId", Integer.valueOf(-1));
return;
}
I2PTunnelHTTPBidirServer serv = new I2PTunnelHTTPBidirServer(serverHost, portNum, port2Num, privKeyFile, args[3], spoofedHost, l, (EventDispatcher) this, this);
serv.setReadTimeout(readTimeout);
serv.startRunning();
addtask(serv);
notifyEvent("serverTaskId", Integer.valueOf(serv.getId()));
return;
} else {
l.log("httpserver <host> <port> <proxyport> <spoofedhost> <privkeyfile>");
l.log(" creates a bidirectional HTTP server that sends all incoming data\n"
+ " of its destination to host:port., filtering the HTTP\n"
+ " headers so it looks like the request is to the spoofed host,"
+ " and listens to host:proxyport to proxy HTTP requests.");
notifyEvent("serverTaskId", Integer.valueOf(-1));
}
}
/**
* Run the server pointing at the host and port specified using the private i2p
* destination loaded from the given base64 stream. <p />

View File

@@ -67,7 +67,7 @@ public abstract class I2PTunnelClientBase extends I2PTunnelTask implements Runna
// private Object conLock = new Object();
/** List of Socket for those accept()ed but not yet started up */
private List _waitingSockets = new ArrayList(); // FIXME should be final and use a factory. FIXME
protected final List _waitingSockets = new ArrayList(4); // FIXME should be final and use a factory. FIXME
/** How many connections will we allow to be in the process of being built at once? */
private int _numConnectionBuilders;
/** How long will we allow sockets to sit in the _waitingSockets map before killing them? */
@@ -89,12 +89,52 @@ public abstract class I2PTunnelClientBase extends I2PTunnelTask implements Runna
private static final int DEFAULT_NUM_CONNECTION_BUILDERS = 5;
private static final int DEFAULT_MAX_WAIT_TIME = 30*1000;
//public I2PTunnelClientBase(int localPort, boolean ownDest,
// Logging l) {
// I2PTunnelClientBase(localPort, ownDest, l, (EventDispatcher)null);
//}
// true if we are chained from a server.
private boolean chained = false;
public I2PTunnelClientBase(int localPort, Logging l, I2PSocketManager sktMgr,
I2PTunnel tunnel, EventDispatcher notifyThis, long clientId )
throws IllegalArgumentException {
super(localPort + " (uninitialized)", notifyThis, tunnel);
chained = true;
sockMgr = sktMgr;
_clientId = clientId;
this.localPort = localPort;
this.l = l;
this.handlerName = handlerName + _clientId;
_ownDest = true; // == ! shared client
_context = tunnel.getContext();
_context.statManager().createRateStat("i2ptunnel.client.closeBacklog", "How many pending sockets remain when we close one due to backlog?", "I2PTunnel", new long[] { 60*1000, 10*60*1000, 60*60*1000 });
_context.statManager().createRateStat("i2ptunnel.client.closeNoBacklog", "How many pending sockets remain when it was removed prior to backlog timeout?", "I2PTunnel", new long[] { 60*1000, 10*60*1000, 60*60*1000 });
_context.statManager().createRateStat("i2ptunnel.client.manageTime", "How long it takes to accept a socket and fire it into an i2ptunnel runner (or queue it for the pool)?", "I2PTunnel", new long[] { 60*1000, 10*60*1000, 60*60*1000 });
_context.statManager().createRateStat("i2ptunnel.client.buildRunTime", "How long it takes to run a queued socket into an i2ptunnel runner?", "I2PTunnel", new long[] { 60*1000, 10*60*1000, 60*60*1000 });
Thread t = new I2PAppThread(this);
t.setName("Client " + _clientId);
listenerReady = false;
t.start();
open = true;
synchronized (this) {
while (!listenerReady && open) {
try {
wait();
} catch (InterruptedException e) {
// ignore
}
}
}
configurePool(tunnel);
if (open && listenerReady) {
l.log("Ready! Port " + getLocalPort());
notifyEvent("openBaseClientResult", "ok");
} else {
l.log("Error listening - please see the logs!");
notifyEvent("openBaseClientResult", "error");
}
}
public I2PTunnelClientBase(int localPort, boolean ownDest, Logging l,
EventDispatcher notifyThis, String handlerName,
I2PTunnel tunnel) throws IllegalArgumentException {
@@ -188,7 +228,7 @@ public abstract class I2PTunnelClientBase extends I2PTunnelTask implements Runna
*
*/
private void configurePool(I2PTunnel tunnel) {
_waitingSockets = new ArrayList(4);
//_waitingSockets = new ArrayList(4);
Properties opts = tunnel.getClientOptions();
String maxWait = opts.getProperty(PROP_MAX_WAIT_TIME, DEFAULT_MAX_WAIT_TIME+"");
@@ -559,10 +599,12 @@ public abstract class I2PTunnelClientBase extends I2PTunnelTask implements Runna
}
return false;
}
I2PSession session = sockMgr.getSession();
if (session != null) {
getTunnel().removeSession(session);
}
if (!chained) {
I2PSession session = sockMgr.getSession();
if (session != null) {
getTunnel().removeSession(session);
}
} // else the app chaining to this one closes it!
}
l.log("Closing client " + toString());
open = false;

View File

@@ -0,0 +1,54 @@
/**
* DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
* Version 2, December 2004
*
* Copyright (C) sponge
* Planet Earth
* Everyone is permitted to copy and distribute verbatim or modified
* copies of this license document, and changing it is allowed as long
* as the name is changed.
*
* DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
* TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
*
* 0. You just DO WHAT THE FUCK YOU WANT TO.
*
* See...
*
* http://sam.zoy.org/wtfpl/
* and
* http://en.wikipedia.org/wiki/WTFPL
*
* ...for any additional details and liscense questions.
*/
package net.i2p.i2ptunnel;
// import java.util.ArrayList;
import net.i2p.client.streaming.I2PSocketManager;
import net.i2p.util.EventDispatcher;
/**
* Reuse HTTP server's I2PSocketManager for a proxy with no outproxy capability.
*
* @author sponge
*/
public class I2PTunnelHTTPBidirProxy extends I2PTunnelHTTPClient implements Runnable {
/**
* @throws IllegalArgumentException if the I2PTunnel does not contain
* valid config to contact the router
*/
public I2PTunnelHTTPBidirProxy(int localPort, Logging l, I2PSocketManager sockMgr, I2PTunnel tunnel, EventDispatcher notifyThis, long clientId) {
super(localPort, l, sockMgr, tunnel, notifyThis, clientId);
// proxyList = new ArrayList();
setName(getLocalPort() + " -> HTTPClient [NO PROXIES]");
startRunning();
notifyEvent("openHTTPClientResult", "ok");
}
}

View File

@@ -0,0 +1,44 @@
/* I2PTunnel is GPL'ed (with the exception mentioned in I2PTunnel.java)
* (c) 2003 - 2004 mihi
*/
package net.i2p.i2ptunnel;
import java.io.File;
import java.io.InputStream;
import java.net.InetAddress;
import net.i2p.util.EventDispatcher;
import net.i2p.util.Log;
public class I2PTunnelHTTPBidirServer extends I2PTunnelHTTPServer {
private final static Log log = new Log(I2PTunnelHTTPBidirServer.class);
public I2PTunnelHTTPBidirServer(InetAddress host, int port, int proxyport, String privData, String spoofHost, Logging l, EventDispatcher notifyThis, I2PTunnel tunnel) {
super(host, port, privData, spoofHost, l, notifyThis, tunnel);
finishSetupI2PTunnelHTTPBidirServer(l, proxyport);
}
public I2PTunnelHTTPBidirServer(InetAddress host, int port, int proxyport, File privkey, String privkeyname, String spoofHost, Logging l, EventDispatcher notifyThis, I2PTunnel tunnel) {
super(host, port, privkey, privkeyname, spoofHost, l, notifyThis, tunnel);
finishSetupI2PTunnelHTTPBidirServer(l, proxyport);
}
public I2PTunnelHTTPBidirServer(InetAddress host, int port, int proxyport, InputStream privData, String privkeyname, String spoofHost, Logging l, EventDispatcher notifyThis, I2PTunnel tunnel) {
super(host, port, privData, privkeyname, spoofHost, l, notifyThis, tunnel);
finishSetupI2PTunnelHTTPBidirServer(l, proxyport);
}
private void finishSetupI2PTunnelHTTPBidirServer(Logging l, int proxyport) {
localPort = proxyport;
bidir = true;
/* start the httpclient */
task = new I2PTunnelHTTPBidirProxy(localPort, l, sockMgr, getTunnel(), getEventDispatcher(), __serverId);
sockMgr.setName("Server"); // TO-DO: Need to change this to "Bidir"!
getTunnel().addSession(sockMgr.getSession());
l.log("Ready!");
notifyEvent("openServerResult", "ok");
}
}

View File

@@ -24,6 +24,7 @@ import java.util.StringTokenizer;
import net.i2p.I2PAppContext;
import net.i2p.I2PException;
import net.i2p.client.streaming.I2PSocket;
import net.i2p.client.streaming.I2PSocketManager;
import net.i2p.client.streaming.I2PSocketOptions;
import net.i2p.data.DataFormatException;
import net.i2p.data.DataHelper;
@@ -56,7 +57,7 @@ import net.i2p.util.Translate;
public class I2PTunnelHTTPClient extends I2PTunnelClientBase implements Runnable {
private static final Log _log = new Log(I2PTunnelHTTPClient.class);
private final List proxyList;
protected final List proxyList = new ArrayList();
private HashMap addressHelpers = new HashMap();
@@ -150,7 +151,15 @@ public class I2PTunnelHTTPClient extends I2PTunnelClientBase implements Runnable
private static final File _errorDir = new File(I2PAppContext.getGlobalContext().getBaseDir(), "docs");
public I2PTunnelHTTPClient(int localPort, Logging l, I2PSocketManager sockMgr, I2PTunnel tunnel, EventDispatcher notifyThis, long clientId) {
super(localPort, l, sockMgr, tunnel, notifyThis, clientId);
// proxyList = new ArrayList();
setName(getLocalPort() + " -> HTTPClient [NO PROXIES]");
startRunning();
notifyEvent("openHTTPClientResult", "ok");
}
/**
* @throws IllegalArgumentException if the I2PTunnel does not contain
* valid config to contact the router
@@ -160,7 +169,7 @@ public class I2PTunnelHTTPClient extends I2PTunnelClientBase implements Runnable
I2PTunnel tunnel) throws IllegalArgumentException {
super(localPort, ownDest, l, notifyThis, "HTTPHandler " + (++__clientId), tunnel);
proxyList = new ArrayList();
//proxyList = new ArrayList(); // We won't use outside of i2p
if (waitEventValue("openBaseClientResult").equals("error")) {
notifyEvent("openHTTPClientResult", "error");
return;
@@ -251,6 +260,7 @@ public class I2PTunnelHTTPClient extends I2PTunnelClientBase implements Runnable
/**
* Overridden to close internal socket too.
*/
@Override
public boolean close(boolean forced) {
boolean rv = super.close(forced);
if (this.isr != null)

View File

@@ -39,21 +39,21 @@ public class I2PTunnelHTTPServer extends I2PTunnelServer {
public I2PTunnelHTTPServer(InetAddress host, int port, String privData, String spoofHost, Logging l, EventDispatcher notifyThis, I2PTunnel tunnel) {
super(host, port, privData, l, notifyThis, tunnel);
_spoofHost = spoofHost;
getTunnel().getContext().statManager().createRateStat("i2ptunnel.httpserver.blockingHandleTime", "how long the blocking handle takes to complete", "I2PTunnel", new long[] { 60*1000, 10*60*1000, 3*60*60*1000 });
getTunnel().getContext().statManager().createRateStat("i2ptunnel.httpNullWorkaround", "How often an http server works around a streaming lib or i2ptunnel bug", "I2PTunnel", new long[] { 60*1000, 10*60*1000 });
setupI2PTunnelHTTPServer(spoofHost);
}
public I2PTunnelHTTPServer(InetAddress host, int port, File privkey, String privkeyname, String spoofHost, Logging l, EventDispatcher notifyThis, I2PTunnel tunnel) {
super(host, port, privkey, privkeyname, l, notifyThis, tunnel);
_spoofHost = spoofHost;
getTunnel().getContext().statManager().createRateStat("i2ptunnel.httpserver.blockingHandleTime", "how long the blocking handle takes to complete", "I2PTunnel.HTTPServer", new long[] { 60*1000, 10*60*1000, 3*60*60*1000 });
getTunnel().getContext().statManager().createRateStat("i2ptunnel.httpNullWorkaround", "How often an http server works around a streaming lib or i2ptunnel bug", "I2PTunnel.HTTPServer", new long[] { 60*1000, 10*60*1000 });
setupI2PTunnelHTTPServer(spoofHost);
}
public I2PTunnelHTTPServer(InetAddress host, int port, InputStream privData, String privkeyname, String spoofHost, Logging l, EventDispatcher notifyThis, I2PTunnel tunnel) {
super(host, port, privData, privkeyname, l, notifyThis, tunnel);
_spoofHost = spoofHost;
setupI2PTunnelHTTPServer(spoofHost);
}
private void setupI2PTunnelHTTPServer(String spoofHost) {
_spoofHost = spoofHost;
getTunnel().getContext().statManager().createRateStat("i2ptunnel.httpserver.blockingHandleTime", "how long the blocking handle takes to complete", "I2PTunnel.HTTPServer", new long[] { 60*1000, 10*60*1000, 3*60*60*1000 });
getTunnel().getContext().statManager().createRateStat("i2ptunnel.httpNullWorkaround", "How often an http server works around a streaming lib or i2ptunnel bug", "I2PTunnel.HTTPServer", new long[] { 60*1000, 10*60*1000 });
}

View File

@@ -4,6 +4,7 @@
package net.i2p.i2ptunnel;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
@@ -48,26 +49,29 @@ public class I2PTunnelServer extends I2PTunnelTask implements Runnable {
protected long readTimeout = DEFAULT_READ_TIMEOUT;
private static final boolean DEFAULT_USE_POOL = false;
protected static volatile long __serverId = 0;
private static final String PROP_HANDLER_COUNT = "i2ptunnel.blockingHandlerCount";
private static final int DEFAULT_HANDLER_COUNT = 10;
protected I2PTunnelTask task = null;
protected boolean bidir = false;
private int DEFAULT_LOCALPORT = 4488;
protected int localPort = DEFAULT_LOCALPORT;
public I2PTunnelServer(InetAddress host, int port, String privData, Logging l, EventDispatcher notifyThis, I2PTunnel tunnel) {
super(host + ":" + port + " <- " + privData, notifyThis, tunnel);
ByteArrayInputStream bais = new ByteArrayInputStream(Base64.decode(privData));
String usePool = tunnel.getClientOptions().getProperty("i2ptunnel.usePool");
if (usePool != null)
_usePool = "true".equalsIgnoreCase(usePool);
else
_usePool = DEFAULT_USE_POOL;
SetUsePool(tunnel);
init(host, port, bais, privData, l);
}
public I2PTunnelServer(InetAddress host, int port, File privkey, String privkeyname, Logging l,
EventDispatcher notifyThis, I2PTunnel tunnel) {
super(host + ":" + port + " <- " + privkeyname, notifyThis, tunnel);
String usePool = tunnel.getClientOptions().getProperty("i2ptunnel.usePool");
if (usePool != null)
_usePool = "true".equalsIgnoreCase(usePool);
else
_usePool = DEFAULT_USE_POOL;
SetUsePool(tunnel);
FileInputStream fis = null;
try {
fis = new FileInputStream(privkey);
@@ -83,12 +87,17 @@ public class I2PTunnelServer extends I2PTunnelTask implements Runnable {
public I2PTunnelServer(InetAddress host, int port, InputStream privData, String privkeyname, Logging l, EventDispatcher notifyThis, I2PTunnel tunnel) {
super(host + ":" + port + " <- " + privkeyname, notifyThis, tunnel);
String usePool = tunnel.getClientOptions().getProperty("i2ptunnel.usePool");
SetUsePool(tunnel);
init(host, port, privData, privkeyname, l);
}
private void SetUsePool(I2PTunnel Tunnel) {
String usePool = Tunnel.getClientOptions().getProperty("i2ptunnel.usePool");
if (usePool != null)
_usePool = "true".equalsIgnoreCase(usePool);
else
_usePool = DEFAULT_USE_POOL;
init(host, port, privData, privkeyname, l);
}
private void init(InetAddress host, int port, InputStream privData, String privkeyname, Logging l) {
@@ -106,17 +115,29 @@ public class I2PTunnelServer extends I2PTunnelTask implements Runnable {
}
}
// copy the privData to a new BAIS, so we can always reset() it if we have to retry
ByteArrayInputStream privDataCopy;
try {
privDataCopy = copyOfInputStream(privData);
} catch (IOException ioe) {
_log.log(Log.CRIT, "Cannot read private key data for " + privkeyname, ioe);
return;
}
// Todo: Can't stop a tunnel from the UI while it's in this loop (no session yet)
while (sockMgr == null) {
synchronized (slock) {
sockMgr = I2PSocketManagerFactory.createManager(privData, getTunnel().host, portNum,
sockMgr = I2PSocketManagerFactory.createManager(privDataCopy, getTunnel().host, portNum,
props);
}
if (sockMgr == null) {
_log.log(Log.CRIT, "Unable to create socket manager");
try { Thread.sleep(10*1000); } catch (InterruptedException ie) {}
privDataCopy.reset();
}
}
sockMgr.setName("Server");
getTunnel().addSession(sockMgr.getSession());
l.log("Ready!");
@@ -124,8 +145,24 @@ public class I2PTunnelServer extends I2PTunnelTask implements Runnable {
open = true;
}
private static volatile long __serverId = 0;
/**
* Copy input stream to a byte array, so we can retry
* @since 0.7.10
*/
private static ByteArrayInputStream copyOfInputStream(InputStream is) throws IOException {
byte[] buf = new byte[128];
ByteArrayOutputStream os = new ByteArrayOutputStream(768);
try {
int read;
while ((read = is.read(buf)) >= 0) {
os.write(buf, 0, read);
}
} finally {
try { is.close(); } catch (IOException ioe) {}
// don't need to close BAOS
}
return new ByteArrayInputStream(os.toByteArray());
}
/**
* Start running the I2PTunnelServer.
@@ -158,6 +195,9 @@ public class I2PTunnelServer extends I2PTunnelTask implements Runnable {
public boolean close(boolean forced) {
if (!open) return true;
if (task != null) {
task.close(forced);
}
synchronized (lock) {
if (!forced && sockMgr.listSockets().size() != 0) {
l.log("There are still active connections!");
@@ -181,9 +221,6 @@ public class I2PTunnelServer extends I2PTunnelTask implements Runnable {
}
}
private static final String PROP_HANDLER_COUNT = "i2ptunnel.blockingHandlerCount";
private static final int DEFAULT_HANDLER_COUNT = 10;
protected int getHandlerCount() {
int rv = DEFAULT_HANDLER_COUNT;
String cnt = getTunnel().getClientOptions().getProperty(PROP_HANDLER_COUNT);

View File

@@ -154,6 +154,8 @@ public class TunnelController implements Logging {
startServer();
} else if ("httpserver".equals(type)) {
startHttpServer();
} else if ("httpbidirserver".equals(type)) {
startHttpBidirServer();
} else if ("ircserver".equals(type)) {
startIrcServer();
} else if ("streamrserver".equals(type)) {
@@ -294,6 +296,16 @@ public class TunnelController implements Logging {
_tunnel.runHttpServer(new String[] { targetHost, targetPort, spoofedHost, privKeyFile }, this);
}
private void startHttpBidirServer() {
setListenOn();
String targetHost = getTargetHost();
String targetPort = getTargetPort();
String listenPort = getListenPort();
String spoofedHost = getSpoofedHost();
String privKeyFile = getPrivKeyFile();
_tunnel.runHttpBidirServer(new String[] { targetHost, targetPort, listenPort, spoofedHost, privKeyFile }, this);
}
private void startIrcServer() {
String targetHost = getTargetHost();
String targetPort = getTargetPort();

View File

@@ -16,7 +16,7 @@ public class Pinger implements Source, Runnable {
public void start() {
this.running = true;
this.waitlock = new Object();
//this.waitlock = new Object();
this.thread.start();
}
@@ -54,6 +54,6 @@ public class Pinger implements Source, Runnable {
protected Sink sink;
protected Thread thread;
protected Object waitlock; // FIXME should be final and use a factory. FIXME
private final Object waitlock = new Object();
protected boolean running;
}

View File

@@ -29,7 +29,7 @@ public class I2PSink implements Sink {
// create maker
if (!raw)
this.maker = new I2PDatagramMaker(this.sess);
this.maker.setI2PDatagramMaker(this.sess);
}
/** @param src ignored */
@@ -54,20 +54,8 @@ public class I2PSink implements Sink {
}
}
protected boolean raw;
protected I2PSession sess;
protected Destination dest;
protected I2PDatagramMaker maker; // FIXME should be final and use a factory. FIXME
protected final I2PDatagramMaker maker= new I2PDatagramMaker(); // FIXME should be final and use a factory. FIXME
}

View File

@@ -28,7 +28,7 @@ public class I2PSinkAnywhere implements Sink {
// create maker
if (!raw)
this.maker = new I2PDatagramMaker(this.sess);
this.maker.setI2PDatagramMaker(this.sess);
}
/** @param to - where it's going */
@@ -52,20 +52,8 @@ public class I2PSinkAnywhere implements Sink {
}
}
protected boolean raw;
protected I2PSession sess;
protected Destination dest;
protected I2PDatagramMaker maker; // FIXME should be final and use a factory. FIXME
protected final I2PDatagramMaker maker = new I2PDatagramMaker();
}

View File

@@ -389,6 +389,7 @@ public class IndexBean {
else if ("ircserver".equals(internalType)) return _("IRC server");
else if ("streamrclient".equals(internalType)) return _("Streamr client");
else if ("streamrserver".equals(internalType)) return _("Streamr server");
else if ("httpbidirserver".equals(internalType)) return _("HTTP bidir");
else return internalType;
}
@@ -779,8 +780,11 @@ public class IndexBean {
config.setProperty("listenPort", _port);
if (_reachableByOther != null)
config.setProperty("interface", _reachableByOther);
else
else if (_reachableBy != null)
config.setProperty("interface", _reachableBy);
else
config.setProperty("interface", "");
config.setProperty("sharedClient", _sharedClient + "");
for (String p : _booleanClientOpts)
config.setProperty("option." + p, "" + _booleanOptions.contains(p));
@@ -806,11 +810,22 @@ public class IndexBean {
} else if ("ircclient".equals(_type) || "client".equals(_type) || "streamrclient".equals(_type)) {
if (_targetDestination != null)
config.setProperty("targetDestination", _targetDestination);
} else if ("httpserver".equals(_type)) {
} else if ("httpserver".equals(_type) || "httpbidirserver".equals(_type)) {
if (_spoofedHost != null)
config.setProperty("spoofedHost", _spoofedHost);
}
if ("httpbidirserver".equals(_type)) {
if (_port != null)
config.setProperty("listenPort", _port);
if (_reachableByOther != null)
config.setProperty("interface", _reachableByOther);
else if (_reachableBy != null)
config.setProperty("interface", _reachableBy);
else if (_targetHost != null)
config.setProperty("interface", _targetHost);
else
config.setProperty("interface", "");
}
return config;
}

View File

@@ -113,11 +113,58 @@
<input type="text" size="6" maxlength="5" id="targetPort" name="targetPort" title="Target Port Number" value="<%=editBean.getTargetPort(curTunnel)%>" class="freetext" />
</div>
<% if ("httpbidirserver".equals(tunnelType)) {
%>
<div class="subdivider">
<hr />
</div>
<div id="accessField" class="rowItem">
<label><%=intl._("Access Point")%>:</label>
</div>
<div id="portField" class="rowItem">
<label for="port" accesskey="P">
<span class="accessKey">P</span>ort:
<% String value4 = editBean.getClientPort(curTunnel);
if (value4 == null || "".equals(value4.trim())) {
out.write(" <font color=\"red\">(");
out.write(intl._("required"));
out.write(")</font>");
}
%>
</label>
<input type="text" size="6" maxlength="5" id="port" name="port" title="Access Port Number" value="<%=editBean.getClientPort(curTunnel)%>" class="freetext" />
</div>
<% String otherInterface = "";
String clientInterface = editBean.getClientInterface(curTunnel);
%>
<div id="reachField" class="rowItem">
<label for="reachableBy" accesskey="r">
<%=intl._("Reachable by")%>(<span class="accessKey">R</span>):
</label>
<select id="reachableBy" name="reachableBy" title="Valid IP for Client Access" class="selectbox">
<% if (!("127.0.0.1".equals(clientInterface)) &&
!("0.0.0.0".equals(clientInterface)) &&
(clientInterface != null) &&
(clientInterface.trim().length() > 0)) {
otherInterface = clientInterface;
}
%><option value="127.0.0.1"<%=("127.0.0.1".equals(clientInterface) ? " selected=\"selected\"" : "")%>><%=intl._("Locally (127.0.0.1)")%></option>
<option value="0.0.0.0"<%=("0.0.0.0".equals(clientInterface) ? " selected=\"selected\"" : "")%>><%=intl._("Everyone (0.0.0.0)")%></option>
<option value="other"<%=(!("".equals(otherInterface)) ? " selected=\"selected\"" : "")%>><%=intl._("LAN Hosts (Please specify your LAN address)")%></option>
</select>
</div>
<div id="otherField" class="rowItem">
<label for="reachableByOther" accesskey="O">
<%=intl._("Other")%>(<span class="accessKey">O</span>):
</label>
<input type="text" size="20" id="reachableByOther" name="reachableByOther" title="Alternative IP for Client Access" value="<%=otherInterface%>" class="freetext" />
</div>
<% } %>
<div class="subdivider">
<hr />
</div>
<% if ("httpserver".equals(tunnelType)) {
<% if (("httpserver".equals(tunnelType)) || ("httpbidirserver".equals(tunnelType))) {
%><div id="websiteField" class="rowItem">
<label for="spoofedHost" accesskey="W">
<%=intl._("Website name")%>(<span class="accessKey">W</span>):
@@ -129,8 +176,8 @@
%><div id="privKeyField" class="rowItem">
<label for="privKeyFile" accesskey="k">
<%=intl._("Private key file")%>(<span class="accessKey">k</span>):
<% String value2 = editBean.getPrivateKeyFile(curTunnel);
if (value2 == null || "".equals(value2.trim())) {
<% String value3 = editBean.getPrivateKeyFile(curTunnel);
if (value3 == null || "".equals(value3.trim())) {
out.write(" <font color=\"red\">(");
out.write(intl._("required"));
out.write(")</font>");
@@ -139,6 +186,7 @@
</label>
<input type="text" size="30" id="privKeyFile" name="privKeyFile" title="Path to Private Key File" value="<%=editBean.getPrivateKeyFile(curTunnel)%>" class="freetext" />
</div>
<% if (!"streamrserver".equals(tunnelType)) { %>
<div id="profileField" class="rowItem">
<label for="profile" accesskey="f">

View File

@@ -107,9 +107,9 @@
</div>
<div class="targetField rowItem">
<%
if ("httpserver".equals(indexBean.getInternalType(curServer)) && indexBean.getTunnelStatus(curServer) == IndexBean.RUNNING) {
if (("httpserver".equals(indexBean.getInternalType(curServer)) || ("httpbidirserver".equals(indexBean.getInternalType(curServer)))) && indexBean.getTunnelStatus(curServer) == IndexBean.RUNNING) {
%><label><%=intl._("Preview")%>:</label>
<a class="control" title="Test HTTP server through I2P" href="http://<%=indexBean.getDestHashBase32(curServer)%>.b32.i2p"><%=intl._("Preview")%></a>
<a class="control" title="Test HTTP server through I2P" href="http://<%=indexBean.getDestHashBase32(curServer)%>.b32.i2p"><%=intl._("Preview")%></a>
<%
} else if (indexBean.getTunnelStatus(curServer) == IndexBean.RUNNING) {
%><span class="text"><%=intl._("Base32 Address")%>:<br /><%=indexBean.getDestHashBase32(curServer)%>.b32.i2p</span>
@@ -164,6 +164,7 @@
<select name="type">
<option value="server"><%=intl._("Standard")%></option>
<option value="httpserver">HTTP</option>
<option value="httpbidirserver">HTTP bidir</option>
<option value="ircserver">IRC</option>
<option value="streamrserver">Streamr</option>
</select>

View File

@@ -8,8 +8,8 @@ msgid ""
msgstr ""
"Project-Id-Version: I2P i2ptunnel\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2010-01-02 04:59+0000\n"
"PO-Revision-Date: 2010-01-02 07:05+0000\n"
"POT-Creation-Date: 2010-01-14 06:24+0000\n"
"PO-Revision-Date: 2010-01-18 18:40+0000\n"
"Last-Translator: 4get <forget@mail.i2p>\n"
"Language-Team: foo <foo@bar>\n"
"MIME-Version: 1.0\n"
@@ -17,12 +17,12 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"X-Poedit-Language: Russian\n"
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:430
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:436
#, java-format
msgid "To visit the destination in your host database, click <a href=\"{0}\">here</a>. To visit the conflicting addresshelper link by temporarily giving it a random alias, click <a href=\"{1}\">here</a>."
msgstr "Для перехода по ссылке из локальной адресной книги, нажмите <a href=\"{0}\">здесь</a>. Для перехода по новой addresshelper-ссылке с временным присвоением ей случайного имени, нажмите <a href=\"{1}\">здесь</a>."
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:800
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:802
msgid "Click a link below to look for an address helper by using a \"jump\" service:"
msgstr "Jump-сервисы, которые, возможно, знают нужную Вам addresshelper-ссылку:"
@@ -70,6 +70,10 @@ msgstr "Streamr-клиент"
msgid "Streamr server"
msgstr "Streamr-сервер"
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:392
msgid "HTTP bidir"
msgstr "HTTP bidir (экспериментальный двунаправленный режим, инструкцию спрашивайте у sponge)"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:73
msgid "I2P Tunnel Manager - Edit Client Tunnel"
msgstr "Менеджер Туннелей I2P — Редактирование Клиентского Туннеля"
@@ -112,6 +116,7 @@ msgstr "Точка доступа"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:130
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:132
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:167
msgid "Access Point"
msgstr "Точка доступа"
@@ -119,28 +124,34 @@ msgstr "Точка доступа"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:179
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:207
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:157
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:181
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:172
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:228
msgid "required"
msgstr "*"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:150
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:142
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:183
msgid "Reachable by"
msgstr "Кому будет доступно (Сетевой интерфейс)"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:162
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:195
msgid "Locally (127.0.0.1)"
msgstr "Только в пределах этого компьютера (127.0.0.1)"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:166
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:199
msgid "Everyone (0.0.0.0)"
msgstr "Всем (0.0.0.0)"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:170
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:203
msgid "LAN Hosts (Please specify your LAN address)"
msgstr "Только из локальной сети (Введите свой LAN-адрес)"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:186
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:205
msgid "Other"
msgstr "Адрес сетевого интерфейса"
@@ -157,17 +168,17 @@ msgid "name or destination"
msgstr "имя или адрес"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:220
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:190
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:237
msgid "Profile"
msgstr "Режим"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:227
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:197
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:244
msgid "interactive connection"
msgstr "оптимизировать для малых задержек (irc)"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:231
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:201
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:248
msgid "bulk connection (downloads/websites/BT)"
msgstr "оптимизировать для большого обьема (www/bittorrent)"
@@ -198,7 +209,7 @@ msgid "(Check the Box for 'YES')"
msgstr "(поставьте галочку для включения)"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:253
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:219
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:266
msgid "Advanced networking options"
msgstr "Расширенные сетевые настройки"
@@ -207,151 +218,151 @@ msgid "(NOTE: when this client proxy is configured to share tunnels, then these
msgstr "(ПРИМЕЧАНИЕ: при коллективном использовании туннелей эти опции будут применяться ко всем коллективным прокси-клиентам!)"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:257
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:221
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:268
msgid "Tunnel Options"
msgstr "Параметры туннеля"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:259
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:223
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:270
msgid "Length"
msgstr "Длина"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:266
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:230
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:277
msgid "0 hop tunnel (low anonymity, low latency)"
msgstr "0 хопов (низкая анонимность, малые задержки)"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:270
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:234
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:281
msgid "1 hop tunnel (medium anonymity, medium latency)"
msgstr "1 хоп (умеренная анонимность, умеренные задержки)"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:274
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:238
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:285
msgid "2 hop tunnel (high anonymity, high latency)"
msgstr "2 хопа (высокая анонимность, высокие задержки)"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:278
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:242
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:289
msgid "3 hop tunnel (very high anonymity, poor performance)"
msgstr "3 хопа (очень высокая анонимность, низкая производительность)"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:287
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:251
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:298
msgid "hop tunnel (very poor performance)"
msgstr "хопов (очень низкая производительность)"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:292
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:256
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:303
msgid "Variance"
msgstr "Разброс"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:299
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:263
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:310
msgid "0 hop variance (no randomisation, consistant performance)"
msgstr "нулевой разброс (без рандомизации, фиксированная производительность)"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:303
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:267
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:314
msgid "+ 0-1 hop variance (medium additive randomisation, subtractive performance)"
msgstr "+ 0-1 разброс (умеренно повышенная рандомизация, пониженная производительность)"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:307
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:271
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:318
msgid "+ 0-2 hop variance (high additive randomisation, subtractive performance)"
msgstr "+ 0-2 разброс (сильно повышенная рандомизация, пониженная производительность)"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:311
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:275
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:322
msgid "+/- 0-1 hop variance (standard randomisation, standard performance)"
msgstr "+/- 0-1 разброс (стандартная рандомизация, стандартная производительность)"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:315
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:279
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:326
msgid "+/- 0-2 hop variance (not recommended)"
msgstr "+/- 0-2 разброс (не рекомендуется)"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:327
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:291
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:338
msgid "hop variance"
msgstr "разброс"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:332
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:296
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:343
msgid "Count"
msgstr "Количество"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:339
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:303
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:350
msgid "1 inbound, 1 outbound tunnel (low bandwidth usage, less reliability)"
msgstr "1 входящий, 1 исходящий туннель (низкая пропускная способность, низкая надежность) "
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:343
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:307
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:354
msgid "2 inbound, 2 outbound tunnels (standard bandwidth usage, standard reliability)"
msgstr "2 входящих, 2 исходящих туннеля (стандартная пропускная способность, стандартная надежность)"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:347
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:311
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:358
msgid "3 inbound, 3 outbound tunnels (higher bandwidth usage, higher reliability)"
msgstr "3 входящих, 3 исходящих туннеля (высокая пропускная способность, высокая надежность)"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:356
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:320
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:367
msgid "tunnels"
msgstr "туннелей"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:361
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:325
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:372
msgid "Backup Count"
msgstr "Резервное количество"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:368
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:332
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:379
msgid "0 backup tunnels (0 redundancy, no added resource usage)"
msgstr "без резервных туннелей (отсутствие избыточности, отсутствие дополнительной нагрузки на систему)"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:372
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:336
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:383
msgid "1 backup tunnel each direction (low redundancy, low resource usage)"
msgstr "1 резервный туннель в каждом направлении (низкая избыточность, низкая нагрузка на систему)"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:376
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:340
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:387
msgid "2 backup tunnels each direction (medium redundancy, medium resource usage)"
msgstr "2 резервных туннеля в каждом направлении (умеренная избыточность, умеренная нагрузка на систему)"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:380
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:344
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:391
msgid "3 backup tunnels each direction (high redundancy, high resource usage)"
msgstr "3 резервных туннеля в каждом направлении (высокая избыточность, высокая нагрузка на систему)"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:389
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:353
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:400
msgid "backup tunnels"
msgstr "резервных туннелей"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:394
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:358
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:405
msgid "I2CP Options"
msgstr "Параметры I2CP"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:396
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:146
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:360
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:407
msgid "Host"
msgstr "Адрес"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:400
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:152
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:364
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:411
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:244
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:266
msgid "Port"
msgstr "Порт"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:406
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:398
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:445
msgid "Reduce tunnel quantity when idle"
msgstr "Снижать количество туннелей при простое"
@@ -360,20 +371,20 @@ msgstr "Снижать количество туннелей при просто
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:430
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:442
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:452
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:370
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:388
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:400
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:417
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:435
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:447
msgid "Enable"
msgstr "Включить"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:412
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:404
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:451
msgid "Reduced tunnel count"
msgstr "Количество туннелей"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:416
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:436
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:408
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:455
msgid "Idle minutes"
msgstr "Минут простоя"
@@ -402,7 +413,7 @@ msgid "File"
msgstr "Файл"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:460
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:205
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:252
msgid "Local destination"
msgstr "Локальный адрес назначения"
@@ -411,27 +422,27 @@ msgid "(if known)"
msgstr "(если известен)"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:468
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:444
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:491
msgid "Custom options"
msgstr "Дополнительные параметры"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:472
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:448
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:495
msgid "NOTE: If tunnel is currently running, most changes will not take effect until tunnel is stopped and restarted."
msgstr "ПРИМЕЧАНИЕ: для вступления в силу измененных настроек потребуется остановка и перезапуск туннеля"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:474
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:450
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:497
msgid "Save"
msgstr "Сохранить"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:478
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:454
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:501
msgid "Delete"
msgstr "Удалить"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:480
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:456
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:503
msgid "Cancel"
msgstr "Отмена"
@@ -447,92 +458,92 @@ msgstr "Редактирование настроек серверного ту
msgid "New server settings"
msgstr "Настройки нового серверного туннеля"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:167
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:214
msgid "Website name"
msgstr "Имя веб-сайта"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:171
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:218
msgid "(leave blank for outproxies)"
msgstr "(не заполнять для outproxy)"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:176
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:223
msgid "Private key file"
msgstr "Файл секретного ключа"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:215
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:262
msgid "Add to local addressbook"
msgstr "Добавить в локальную адресную книгу"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:368
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:415
msgid "Encrypt Leaseset"
msgstr "Шифровать LeaseSet"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:374
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:421
msgid "Encryption Key"
msgstr "Ключ шифрования"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:378
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:425
msgid "Generate New Key"
msgstr "Сгенерировать новый ключ"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:380
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:427
msgid "Generate"
msgstr "Сгенерировать"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:382
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:442
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:429
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:489
msgid "(Tunnel must be stopped first)"
msgstr "(Туннель перед этим следует остановить)"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:384
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:431
msgid "Restricted Access List"
msgstr "Ограниченный доступ"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:386
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:433
msgid "Unimplemented"
msgstr "не реализовано"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:392
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:439
msgid "Access List"
msgstr "Список доступа"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:396
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:443
msgid "(Restrict to these clients only)"
msgstr "(Разрешить доступ только перечисленным клиентам)"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:412
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:459
msgid "New Certificate type"
msgstr "Создать новый сертификат. Тип"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:414
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:461
msgid "None"
msgstr "Без"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:418
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:465
msgid "Hashcash (effort)"
msgstr "Hashcash (экспериментальный)"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:424
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:471
msgid "Hashcash Calc Time"
msgstr "Время генерации hashcash-сертификата"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:426
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:473
msgid "Estimate"
msgstr "Прогноз"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:428
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:475
msgid "Hidden"
msgstr "Скрытый"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:432
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:479
msgid "Signed (signed by)"
msgstr "Подписанный (указать кем подписан)"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:438
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:485
msgid "Modify Certificate"
msgstr "Изменить сертификат"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:440
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:487
msgid "Modify"
msgstr "Изменить"

View File

@@ -8,8 +8,8 @@ msgid ""
msgstr ""
"Project-Id-Version: I2P i2ptunnel\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2010-01-02 08:14+0000\n"
"PO-Revision-Date: 2010-01-02 23:43+0800\n"
"POT-Creation-Date: 2010-01-29 07:17+0000\n"
"PO-Revision-Date: 2010-01-29 15:31+0800\n"
"Last-Translator: walking <zhazhenzhong@gmail.com>\n"
"Language-Team: foo <foo@bar>\n"
"MIME-Version: 1.0\n"
@@ -17,12 +17,12 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"X-Poedit-Language: Chinese\n"
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:426
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:436
#, java-format
msgid "To visit the destination in your host database, click <a href=\"{0}\">here</a>. To visit the conflicting addresshelper link by temporarily giving it a random alias, click <a href=\"{1}\">here</a>."
msgstr "要访问您本地【地址簿】中规定的主机(相当与IP),请点击<a href=\"{0}\">这里</a>。要访问【地址助手】返回的主机请点<a href=\"{1}\">这里</a>(主机的域名会被临时强制替换)。"
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:792
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:802
msgid "Click a link below to look for an address helper by using a \"jump\" service:"
msgstr "请点击下面的链接通过【跳转(Jump)】服务提供的【地址助手】链接跳转至域名对应的主机:"
@@ -70,6 +70,10 @@ msgstr "Streamr 客户端"
msgid "Streamr server"
msgstr "Streamr 服务器"
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:392
msgid "HTTP bidir"
msgstr "双向http"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:73
msgid "I2P Tunnel Manager - Edit Client Tunnel"
msgstr "I2P 隧道管理器 - 编辑客户端隧道"
@@ -112,6 +116,7 @@ msgstr "目标"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:130
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:132
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:167
msgid "Access Point"
msgstr "接入点"
@@ -119,28 +124,34 @@ msgstr "接入点"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:179
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:207
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:157
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:181
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:172
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:228
msgid "required"
msgstr "必要"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:150
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:142
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:183
msgid "Reachable by"
msgstr "访问地址"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:162
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:195
msgid "Locally (127.0.0.1)"
msgstr "本地(127.0.0.1)"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:166
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:199
msgid "Everyone (0.0.0.0)"
msgstr "任何人(0.0.0.0)"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:170
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:203
msgid "LAN Hosts (Please specify your LAN address)"
msgstr "局域网(请指定LAN地址)"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:186
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:205
msgid "Other"
msgstr "其他"
@@ -157,17 +168,17 @@ msgid "name or destination"
msgstr "名称或描述"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:220
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:190
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:237
msgid "Profile"
msgstr "连接类型"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:227
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:197
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:244
msgid "interactive connection"
msgstr "速度连接"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:231
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:201
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:248
msgid "bulk connection (downloads/websites/BT)"
msgstr "效率连接(下载/WEB/BT)"
@@ -198,7 +209,7 @@ msgid "(Check the Box for 'YES')"
msgstr "(选中表示\"是\")"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:253
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:219
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:266
msgid "Advanced networking options"
msgstr "高级网络设置"
@@ -207,151 +218,151 @@ msgid "(NOTE: when this client proxy is configured to share tunnels, then these
msgstr "(注意:此客户代理被设置使用共享隧道时,这些设置将影响所有使用共享隧道的客户端!)"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:257
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:221
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:268
msgid "Tunnel Options"
msgstr "隧道选项"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:259
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:223
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:270
msgid "Length"
msgstr "长度"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:266
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:230
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:277
msgid "0 hop tunnel (low anonymity, low latency)"
msgstr "直连(匿名性无,延迟低)"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:270
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:234
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:281
msgid "1 hop tunnel (medium anonymity, medium latency)"
msgstr "隧道跳点x1(匿名性中,延迟中)"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:274
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:238
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:285
msgid "2 hop tunnel (high anonymity, high latency)"
msgstr "隧道跳点x2(匿名性高,延迟高)"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:278
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:242
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:289
msgid "3 hop tunnel (very high anonymity, poor performance)"
msgstr "隧道跳点x3(匿名性优,影响性能)"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:287
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:251
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:298
msgid "hop tunnel (very poor performance)"
msgstr "跳点隧道(严重影响性能)"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:292
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:256
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:303
msgid "Variance"
msgstr "随机变化"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:299
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:263
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:310
msgid "0 hop variance (no randomisation, consistant performance)"
msgstr "隧道长度恒定(随机性无,性能稳定)"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:303
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:267
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:314
msgid "+ 0-1 hop variance (medium additive randomisation, subtractive performance)"
msgstr "隧道长度+ 0-1(随机性中,影响性能)"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:307
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:271
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:318
msgid "+ 0-2 hop variance (high additive randomisation, subtractive performance)"
msgstr "隧道长度+ 0-2(随机性高,影响性能)"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:311
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:275
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:322
msgid "+/- 0-1 hop variance (standard randomisation, standard performance)"
msgstr "隧道长度+/- 0-1(随机性标准,正常性能)"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:315
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:279
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:326
msgid "+/- 0-2 hop variance (not recommended)"
msgstr "隧道程度+/- 0-2(不推荐)"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:327
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:291
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:338
msgid "hop variance"
msgstr "节点数量"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:332
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:296
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:343
msgid "Count"
msgstr "计数"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:339
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:303
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:350
msgid "1 inbound, 1 outbound tunnel (low bandwidth usage, less reliability)"
msgstr "出/入站隧道x1(带宽低,低可靠性)"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:343
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:307
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:354
msgid "2 inbound, 2 outbound tunnels (standard bandwidth usage, standard reliability)"
msgstr "出/入站隧道x2(带宽标准,标准稳定性)"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:347
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:311
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:358
msgid "3 inbound, 3 outbound tunnels (higher bandwidth usage, higher reliability)"
msgstr "出/入站隧道x3(带宽高,高稳定性)"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:356
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:320
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:367
msgid "tunnels"
msgstr "隧道"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:361
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:325
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:372
msgid "Backup Count"
msgstr "备用数量"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:368
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:332
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:379
msgid "0 backup tunnels (0 redundancy, no added resource usage)"
msgstr "无备用隧道(无冗余,不增加资源占用)"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:372
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:336
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:383
msgid "1 backup tunnel each direction (low redundancy, low resource usage)"
msgstr "备用隧道对x1 (低冗余,低资源占用)"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:376
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:340
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:387
msgid "2 backup tunnels each direction (medium redundancy, medium resource usage)"
msgstr "备用隧道对x2 (中冗余,中资源占用)"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:380
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:344
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:391
msgid "3 backup tunnels each direction (high redundancy, high resource usage)"
msgstr "备用隧道对x3 (高冗余,高资源占用)"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:389
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:353
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:400
msgid "backup tunnels"
msgstr "备用隧道"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:394
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:358
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:405
msgid "I2CP Options"
msgstr "I2CP选项"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:396
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:146
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:360
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:407
msgid "Host"
msgstr "主机"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:400
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:152
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:364
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:411
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:244
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:266
msgid "Port"
msgstr "端口"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:406
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:398
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:445
msgid "Reduce tunnel quantity when idle"
msgstr "空闲时缩减隧道数量"
@@ -360,20 +371,20 @@ msgstr "空闲时缩减隧道数量"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:430
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:442
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:452
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:370
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:388
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:400
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:417
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:435
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:447
msgid "Enable"
msgstr "启用"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:412
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:404
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:451
msgid "Reduced tunnel count"
msgstr "削减后的隧道数量"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:416
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:436
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:408
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:455
msgid "Idle minutes"
msgstr "空闲时间(分钟)"
@@ -402,7 +413,7 @@ msgid "File"
msgstr "文件"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:460
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:205
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:252
msgid "Local destination"
msgstr "本地目标"
@@ -411,27 +422,27 @@ msgid "(if known)"
msgstr "(如果已知)"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:468
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:444
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:491
msgid "Custom options"
msgstr "自定义选项"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:472
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:448
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:495
msgid "NOTE: If tunnel is currently running, most changes will not take effect until tunnel is stopped and restarted."
msgstr "注意:如果当前隧道已经启动,设置需要【停止】并重新【启动】相应隧道后才能生效。"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:474
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:450
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:497
msgid "Save"
msgstr "保存"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:478
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:454
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:501
msgid "Delete"
msgstr "删除"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:480
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:456
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:503
msgid "Cancel"
msgstr "取消"
@@ -447,92 +458,92 @@ msgstr "服务器隧道设置"
msgid "New server settings"
msgstr "新建服务器设置"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:167
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:214
msgid "Website name"
msgstr "网站名称"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:171
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:218
msgid "(leave blank for outproxies)"
msgstr "(出口代理这里请置空)"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:176
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:223
msgid "Private key file"
msgstr "私钥文件"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:215
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:262
msgid "Add to local addressbook"
msgstr "添加至本地地址簿"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:368
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:415
msgid "Encrypt Leaseset"
msgstr "加密赁集"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:374
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:421
msgid "Encryption Key"
msgstr "加密密钥"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:378
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:425
msgid "Generate New Key"
msgstr "生成新密钥"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:380
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:427
msgid "Generate"
msgstr "生成"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:382
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:442
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:429
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:489
msgid "(Tunnel must be stopped first)"
msgstr "(必须先停止隧道)"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:384
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:431
msgid "Restricted Access List"
msgstr "限制访问列表"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:386
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:433
msgid "Unimplemented"
msgstr "尚未实现"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:392
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:439
msgid "Access List"
msgstr "访问列表"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:396
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:443
msgid "(Restrict to these clients only)"
msgstr "(仅允许这些客户访问)"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:412
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:459
msgid "New Certificate type"
msgstr "新建证书类型"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:414
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:461
msgid "None"
msgstr "无"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:418
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:465
msgid "Hashcash (effort)"
msgstr "Hashcash (强度)"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:424
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:471
msgid "Hashcash Calc Time"
msgstr "Hashcash 计算时间"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:426
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:473
msgid "Estimate"
msgstr "估算"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:428
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:475
msgid "Hidden"
msgstr "隐藏"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:432
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:479
msgid "Signed (signed by)"
msgstr "签名(签名者)"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:438
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:485
msgid "Modify Certificate"
msgstr "修改证书"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:440
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:487
msgid "Modify"
msgstr "修改"

View File

@@ -1,10 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<project basedir="." default="all" name="jetty">
<property name="jetty.sha1" value="021164f84da7304bd1ff07c268b45aa3e0b13322" />
<property name="jetty.md5" value="a61adc832be6baf2678935506743cfc3" />
<property name="jetty.url" value="http://dist.codehaus.org/jetty/jetty-5.1.x/jetty-5.1.12.zip" />
<property name="jetty.filename" value="jetty-5.1.12.zip" />
<property name="jetty.base" value="jetty-5.1.15" />
<property name="jetty.sha1" value="3a7a3de50f86f0cdb23c33aec632ea7f44132c5e" />
<property name="jetty.filename" value="${jetty.base}.tgz" />
<property name="jetty.url" value="http://dist.codehaus.org/jetty/jetty-5.1.x/${jetty.filename}" />
<property name="verified.filename" value="verified.txt" />
<property name="javac.compilerargs" value="" />
@@ -32,7 +32,6 @@
<echo message="Even if you deploy the Jetty archive manually, the build script will" />
<echo message="still attempt to verify its checksums, which must be:" />
<echo message="SHA1 ${jetty.sha1}" />
<echo message="MD5 ${jetty.md5}" />
<echo message="" />
<input message="Download Jetty archive automatically?" validargs="y,n" addproperty="jetty.download" />
<fail message="Aborting as requested. Please deploy the Jetty archive manually." >
@@ -43,16 +42,18 @@
<get src="${jetty.url}" verbose="true" dest="${jetty.filename}" />
</target>
<uptodate property="verified.already" srcfile="${jetty.filename}" targetfile="${verified.filename}" />
<condition property="verified.already" >
<and>
<available file="${jetty.filename}" />
<uptodate property="foo.bar.baz" srcfile="${jetty.filename}" targetfile="${verified.filename}" />
</and>
</condition>
<target name="verifyJettylib" unless="verified.already" >
<condition property="jetty.zip.verified" >
<and>
<checksum file="${jetty.filename}" algorithm="SHA" property="${jetty.sha1}" />
<checksum file="${jetty.filename}" algorithm="MD5" property="${jetty.md5}" />
</and>
</condition>
<fail message="Jetty archive does not match its checksums!" >
<fail message="Jetty archive does not match its checksum!" >
<condition>
<not>
<istrue value="${jetty.zip.verified}" />
@@ -63,15 +64,16 @@
</target>
<target name="extractJettylib" unless="jetty.zip.extracted" >
<unzip src="${jetty.filename}" dest="." />
<gunzip src="${jetty.filename}" dest="jetty.tar" />
<untar src="jetty.tar" dest="." />
<mkdir dir="jettylib" />
<copy todir="jettylib">
<fileset dir="jetty-5.1.12/lib">
<fileset dir="${jetty.base}/lib">
<include name="*.jar" />
</fileset>
</copy>
<copy todir="jettylib">
<fileset dir="jetty-5.1.12/ext">
<fileset dir="${jetty.base}/ext">
<include name="ant.jar" />
<include name="commons-el.jar" />
<include name="commons-logging.jar" />
@@ -81,7 +83,8 @@
<include name="org.mortbay.jetty.jar" />
</fileset>
</copy>
<delete dir="jetty-5.1.12" />
<delete file="jetty.tar" />
<delete dir="${jetty.base}" />
</target>
<target name="build" depends="jar" />
@@ -128,9 +131,9 @@
<mkdir dir="./build/javadoc" />
<unzip src="${jetty.filename}" dest="./build/javadoc" >
<patternset>
<include name="jetty-5.1.12/javadoc/" />
<include name="${jetty.base}/javadoc/" />
</patternset>
<mapper type="glob" from="jetty-5.1.12/javadoc/*" to="javadoc/*" />
<mapper type="glob" from="${jetty.base}/javadoc/*" to="javadoc/*" />
</unzip>
</target>

View File

@@ -108,7 +108,7 @@ public class ConfigClientsHandler extends FormHandler {
int newClient = clients.size();
String newDesc = getString("desc" + newClient);
if (newDesc != null) {
if (newDesc != null && newDesc.trim().length() > 0) {
// new entry
int spc = newDesc.indexOf(" ");
String clss = newDesc;
@@ -118,7 +118,7 @@ public class ConfigClientsHandler extends FormHandler {
args = newDesc.substring(spc + 1);
}
String name = getString("name" + newClient);
if (name == null) name = "new client";
if (name == null || name.trim().length() <= 0) name = "new client";
ClientAppConfig ca = new ClientAppConfig(clss, name, args, 2*60*1000,
_settings.get(newClient + ".enabled") != null);
clients.add(ca);

View File

@@ -79,10 +79,12 @@ public class ConfigClientsHelper extends HelperBase {
buf.append("<a href=\"").append(link).append("\">").append(_(name)).append("</a>");
} else if (edit && !ro) {
buf.append("<input type=\"text\" name=\"name").append(index).append("\" value=\"");
buf.append(_(name));
if (name.length() > 0)
buf.append(_(name));
buf.append("\" >");
} else {
buf.append(_(name));
if (name.length() > 0)
buf.append(_(name));
}
buf.append("</td><td align=\"center\" width=\"10%\"><input type=\"checkbox\" class=\"optbox\" name=\"").append(index).append(".enabled\" value=\"true\" ");
if (enabled) {

View File

@@ -43,9 +43,9 @@ public class ConfigLoggingHelper extends HelperBase {
buf.append(prefix).append('=').append(level).append('\n');
}
buf.append("</textarea><br>\n");
buf.append("<i>Add additional logging statements above. Example: net.i2p.router.tunnel=WARN</i><br>");
buf.append("<i>Or put entries in the logger.config file. Example: logger.record.net.i2p.router.tunnel=WARN</i><br>");
buf.append("<i>Valid levels are DEBUG, INFO, WARN, ERROR, CRIT</i>\n");
buf.append("<i>" + _("Add additional logging statements above. Example: net.i2p.router.tunnel=WARN") + "</i><br>");
buf.append("<i>" + _("Or put entries in the logger.config file. Example: logger.record.net.i2p.router.tunnel=WARN") + "</i><br>");
buf.append("<i>" + _("Valid levels are DEBUG, INFO, WARN, ERROR, CRIT") + "</i>\n");
return buf.toString();
}

View File

@@ -15,13 +15,32 @@ public class GraphHelper extends HelperBase {
private int _width;
private int _height;
private int _refreshDelaySeconds;
private static final String PROP_X = "routerconsole.graphX";
private static final String PROP_Y = "routerconsole.graphY";
private static final String PROP_REFRESH = "routerconsole.graphRefresh";
private static final String PROP_PERIODS = "routerconsole.graphPeriods";
private static final String PROP_EVENTS = "routerconsole.graphEvents";
private static final int DEFAULT_X = 250;
private static final int DEFAULT_Y = 100;
private static final int DEFAULT_REFRESH = 60;
private static final int DEFAULT_PERIODS = 60;
static final int MAX_X = 2048;
static final int MAX_Y = 1024;
private static final int MIN_REFRESH = 15;
public GraphHelper() {
_periodCount = 60; // SummaryListener.PERIODS;
_showEvents = false;
_width = 250;
_height = 100;
_refreshDelaySeconds = 60;
}
/** set the defaults after we have a context */
@Override
public void setContextId(String contextId) {
super.setContextId(contextId);
_width = _context.getProperty(PROP_X, DEFAULT_X);
_height = _context.getProperty(PROP_Y, DEFAULT_Y);
_periodCount = _context.getProperty(PROP_PERIODS, DEFAULT_PERIODS);
_refreshDelaySeconds = _context.getProperty(PROP_REFRESH, DEFAULT_REFRESH);
_showEvents = Boolean.valueOf(_context.getProperty(PROP_EVENTS)).booleanValue();
}
public void setPeriodCount(String str) {
@@ -29,13 +48,13 @@ public class GraphHelper extends HelperBase {
}
public void setShowEvents(boolean b) { _showEvents = b; }
public void setHeight(String str) {
try { _height = Integer.parseInt(str); } catch (NumberFormatException nfe) {}
try { _height = Math.min(Integer.parseInt(str), MAX_Y); } catch (NumberFormatException nfe) {}
}
public void setWidth(String str) {
try { _width = Integer.parseInt(str); } catch (NumberFormatException nfe) {}
try { _width = Math.min(Integer.parseInt(str), MAX_X); } catch (NumberFormatException nfe) {}
}
public void setRefreshDelay(String str) {
try { _refreshDelaySeconds = Integer.parseInt(str); } catch (NumberFormatException nfe) {}
try { _refreshDelaySeconds = Math.max(Integer.parseInt(str), MIN_REFRESH); } catch (NumberFormatException nfe) {}
}
public String getImages() {
@@ -102,7 +121,9 @@ public class GraphHelper extends HelperBase {
}
return "";
}
public String getForm() {
saveSettings();
try {
_out.write("<br><h3>" + _("Configure Graph Display") + " [<a href=\"configstats.jsp\">" + _("Select Stats") + "</a>]</h3>");
_out.write("<form action=\"graphs.jsp\" method=\"GET\">");
@@ -120,6 +141,25 @@ public class GraphHelper extends HelperBase {
return "";
}
/**
* Silently save settings if changed, no indication of success or failure
* @since 0.7.10
*/
private void saveSettings() {
if (_width != _context.getProperty(PROP_X, DEFAULT_X) ||
_height != _context.getProperty(PROP_Y, DEFAULT_Y) ||
_periodCount != _context.getProperty(PROP_PERIODS, DEFAULT_PERIODS) ||
_refreshDelaySeconds != _context.getProperty(PROP_REFRESH, DEFAULT_REFRESH) ||
_showEvents != Boolean.valueOf(_context.getProperty(PROP_EVENTS)).booleanValue()) {
_context.router().setConfigSetting(PROP_X, "" + _width);
_context.router().setConfigSetting(PROP_Y, "" + _height);
_context.router().setConfigSetting(PROP_PERIODS, "" + _periodCount);
_context.router().setConfigSetting(PROP_REFRESH, "" + _refreshDelaySeconds);
_context.router().setConfigSetting(PROP_EVENTS, "" + _showEvents);
_context.router().saveConfig();
}
}
/** inner class, don't bother reindenting */
private static class AlphaComparator implements Comparator {
public int compare(Object lhs, Object rhs) {

View File

@@ -33,17 +33,17 @@ class ProfileOrganizerRenderer {
_comparator = new ProfileComparator();
}
public void renderStatusHTML(Writer out, boolean full) throws IOException {
Set peers = _organizer.selectAllPeers();
Set<Hash> peers = _organizer.selectAllPeers();
long now = _context.clock().now();
long hideBefore = now - 90*60*1000;
TreeSet order = new TreeSet(_comparator);
TreeSet integratedPeers = new TreeSet(_comparator);
TreeSet<PeerProfile> order = new TreeSet(_comparator);
TreeSet<PeerProfile> integratedPeers = new TreeSet(_comparator);
int older = 0;
int standard = 0;
for (Iterator iter = peers.iterator(); iter.hasNext();) {
Hash peer = (Hash)iter.next();
for (Iterator<Hash> iter = peers.iterator(); iter.hasNext();) {
Hash peer = iter.next();
if (_organizer.getUs().equals(peer)) continue;
PeerProfile prof = _organizer.getProfile(peer);
//if (_organizer.isWellIntegrated(peer)) {
@@ -87,8 +87,8 @@ class ProfileOrganizerRenderer {
buf.append("<th>&nbsp;</th>");
buf.append("</tr>");
int prevTier = 1;
for (Iterator iter = order.iterator(); iter.hasNext();) {
PeerProfile prof = (PeerProfile)iter.next();
for (Iterator<PeerProfile> iter = order.iterator(); iter.hasNext();) {
PeerProfile prof = iter.next();
Hash peer = prof.getPeer();
int tier = 0;
@@ -201,8 +201,8 @@ class ProfileOrganizerRenderer {
buf.append("<th class=\"smallhead\">").append(_("1h Fail Rate")).append("</th>");
buf.append("<th class=\"smallhead\">").append(_("1d Fail Rate")).append("</th>");
buf.append("</tr>");
for (Iterator iter = integratedPeers.iterator(); iter.hasNext();) {
PeerProfile prof = (PeerProfile)iter.next();
for (Iterator<PeerProfile> iter = integratedPeers.iterator(); iter.hasNext();) {
PeerProfile prof = iter.next();
Hash peer = prof.getPeer();
buf.append("<tr><td align=\"center\" nowrap>");
@@ -266,16 +266,8 @@ class ProfileOrganizerRenderer {
out.flush();
}
private class ProfileComparator implements Comparator {
public int compare(Object lhs, Object rhs) {
if ( (lhs == null) || (rhs == null) )
throw new NullPointerException("lhs=" + lhs + " rhs=" + rhs);
if ( !(lhs instanceof PeerProfile) || !(rhs instanceof PeerProfile) )
throw new ClassCastException("lhs=" + lhs.getClass().getName() + " rhs=" + rhs.getClass().getName());
PeerProfile left = (PeerProfile)lhs;
PeerProfile right = (PeerProfile)rhs;
private class ProfileComparator implements Comparator<PeerProfile> {
public int compare(PeerProfile left, PeerProfile right) {
if (_context.profileOrganizer().isFast(left.getPeer())) {
if (_context.profileOrganizer().isFast(right.getPeer())) {
return compareHashes(left, right);

View File

@@ -119,6 +119,10 @@ public class StatSummarizer implements Runnable {
return renderPng(rate, out, -1, -1, false, false, false, false, -1, true);
}
public boolean renderPng(Rate rate, OutputStream out, int width, int height, boolean hideLegend, boolean hideGrid, boolean hideTitle, boolean showEvents, int periodCount, boolean showCredit) throws IOException {
if (width > GraphHelper.MAX_X)
width = GraphHelper.MAX_X;
if (height > GraphHelper.MAX_Y)
height = GraphHelper.MAX_Y;
for (int i = 0; i < _listeners.size(); i++) {
SummaryListener lsnr = (SummaryListener)_listeners.get(i);
if (lsnr.getRate().equals(rate)) {
@@ -147,6 +151,10 @@ public class StatSummarizer implements Runnable {
public boolean renderRatePng(OutputStream out, int width, int height, boolean hideLegend, boolean hideGrid, boolean hideTitle, boolean showEvents, int periodCount, boolean showCredit) throws IOException {
long end = _context.clock().now() - 60*1000;
if (width > GraphHelper.MAX_X)
width = GraphHelper.MAX_X;
if (height > GraphHelper.MAX_Y)
height = GraphHelper.MAX_Y;
if (periodCount <= 0) periodCount = SummaryListener.PERIODS;
if (periodCount > SummaryListener.PERIODS)
periodCount = SummaryListener.PERIODS;
@@ -156,6 +164,7 @@ public class StatSummarizer implements Runnable {
try {
RrdGraphDef def = new RrdGraphDef();
def.setTimePeriod(start/1000, 0);
def.setLowerLimit(0d);
def.setBaseValue(1024);
String title = "Bandwidth usage";
if (!hideTitle)

View File

@@ -38,19 +38,20 @@ public class StatsGenerator {
for (Iterator iter = groups.entrySet().iterator(); iter.hasNext(); ) {
Map.Entry entry = (Map.Entry)iter.next();
String group = (String)entry.getKey();
Set stats = (Set)entry.getValue();
buf.append("<option value=\"/stats.jsp#").append(group).append("\">");
buf.append(_(group)).append("</option>\n");
for (Iterator statIter = stats.iterator(); statIter.hasNext(); ) {
String stat = (String)statIter.next();
buf.append("<option value=\"/stats.jsp#");
buf.append(stat);
buf.append("\">...");
buf.append(stat);
buf.append("</option>\n");
}
out.write(buf.toString());
buf.setLength(0);
// let's just do the groups
//Set stats = (Set)entry.getValue();
//for (Iterator statIter = stats.iterator(); statIter.hasNext(); ) {
// String stat = (String)statIter.next();
// buf.append("<option value=\"/stats.jsp#");
// buf.append(stat);
// buf.append("\">...");
// buf.append(stat);
// buf.append("</option>\n");
//}
//out.write(buf.toString());
//buf.setLength(0);
}
buf.append("</select> <input type=\"submit\" value=\"").append(_("GO")).append("\" />");
buf.append("</form>");

View File

@@ -378,6 +378,12 @@ public class SummaryBarRenderer {
.append(_("Participating"))
.append(":</b></td><td align=\"right\">")
.append(_helper.getParticipatingTunnels())
.append("</td></tr>\n" +
"<tr><td align=\"left\"><b>")
.append(_("Share ratio"))
.append(":</b></td><td align=\"right\">")
.append(_helper.getShareRatio())
.append("</td></tr>\n" +
"</table><hr><h3><a href=\"/jobs.jsp\" target=\"_top\" title=\"")

View File

@@ -99,7 +99,7 @@ public class SummaryHelper extends HelperBase {
//if (!_context.clock().getUpdatedSuccessfully())
Long skew = _context.commSystem().getFramedAveragePeerClockSkew(33);
// Display the actual skew, not the offset
if (skew != null && Math.abs(skew.longValue()) > 45)
if (skew != null && Math.abs(skew.longValue()) > 30)
return _("ERR-Clock Skew of {0}", DataHelper.formatDuration(Math.abs(skew.longValue()) * 1000));
if (_context.router().isHidden())
return _("Hidden");
@@ -414,10 +414,10 @@ public class SummaryHelper extends HelperBase {
}
/** compare translated nicknames - put "shared clients" first in the sort */
private class AlphaComparator implements Comparator {
public int compare(Object lhs, Object rhs) {
String lname = getName((Destination)lhs);
String rname = getName((Destination)rhs);
private class AlphaComparator implements Comparator<Destination> {
public int compare(Destination lhs, Destination rhs) {
String lname = getName(lhs);
String rname = getName(rhs);
String xsc = _("shared clients");
if (lname.equals(xsc))
return -1;
@@ -499,6 +499,15 @@ public class SummaryHelper extends HelperBase {
return _context.tunnelManager().getParticipatingCount();
}
/** @since 0.7.10 */
public String getShareRatio() {
if (_context == null)
return "0";
double sr = _context.tunnelManager().getShareRatio();
DecimalFormat fmt = new DecimalFormat("##0.00");
return fmt.format(sr);
}
/**
* How lagged our job queue is over the last minute (pretty printed with
* the units attached)

View File

@@ -68,7 +68,10 @@ class SummaryListener implements RateSummaryListener {
} catch (IOException ioe) {
_log.error("Error adding", ioe);
} catch (RrdException re) {
_log.error("Error adding", re);
// this can happen after the time slews backwards, so don't make it an error
// org.jrobin.core.RrdException: Bad sample timestamp 1264343107. Last update time was 1264343172, at least one second step is required
if (_log.shouldLog(Log.WARN))
_log.warn("Error adding", re);
}
}
}
@@ -173,7 +176,7 @@ class SummaryRenderer {
throw ioe;
}
}
public void render(OutputStream out) throws IOException { render(out, -1, -1, false, false, false, false, -1, true); }
public void render(OutputStream out) throws IOException { render(out, -1, -1, false, false, false, false, -1, false); }
public void render(OutputStream out, int width, int height, boolean hideLegend, boolean hideGrid, boolean hideTitle, boolean showEvents, int periodCount, boolean showCredit) throws IOException {
long end = _listener.now() - 60*1000;
if (periodCount <= 0) periodCount = SummaryListener.PERIODS;
@@ -184,6 +187,7 @@ class SummaryRenderer {
try {
RrdGraphDef def = new RrdGraphDef();
def.setTimePeriod(start/1000, 0);
def.setLowerLimit(0d);
String name = _listener.getRate().getRateStat().getName();
// heuristic to set K=1024
if ((name.startsWith("bw.") || name.indexOf("Size") >= 0 || name.indexOf("Bps") >= 0 || name.indexOf("memory") >= 0)

View File

@@ -32,8 +32,7 @@
</div>
<% if (System.getProperty("wrapper.version") != null) { %>
<p><%=intl._("If you want the router to restart itself after shutting down, you can choose one of the following.")%>
<%=intl._("This is useful in some situations")%> -
<%=intl._("for example, if you changed some settings that client applications only read at startup, such as the routerconsole password or the interface it listens on.")%>
<%=intl._("This is useful in some situations - for example, if you changed some settings that client applications only read at startup, such as the routerconsole password or the interface it listens on.")%>
<%=intl._("A graceful restart will take a few minutes (but your peers will appreciate your patience), while a hard restart does so immediately.")%>
<%=intl._("After tearing down the router, it will wait 1 minute before starting back up again.")%></p>
<hr><div class="formaction">
@@ -50,8 +49,7 @@
<input type="submit" name="action" value="<%=intl._("Show systray icon")%>" >
<input type="submit" name="action" value="<%=intl._("Hide systray icon")%>" >
</div><h3><%=intl._("Run on startup")%></h3>
<p><%=intl._("You can control whether I2P is run on startup or not by selecting one of the following options")%> -
<%=intl._("I2P will install (or remove) a service accordingly.")%>
<p><%=intl._("You can control whether I2P is run on startup or not by selecting one of the following options - I2P will install (or remove) a service accordingly.")%>
<%=intl._("If you prefer the command line, you can also run the ")%> <code>install_i2p_service_winnt.bat</code> (<%=intl._("or")%>
<code>uninstall_i2p_service_winnt.bat</code>).</p>
<hr><div class="formaction">
@@ -63,9 +61,7 @@
<% if (System.getProperty("wrapper.version") != null) { %>
<h3><%=intl._("Debugging")%></h3>
<p> At times, it may be helpful to debug I2P by getting a thread dump.
To do so, please select the following option and review the thread dumped to
<a href="logs.jsp#servicelogs">wrapper.log</a>.</p>
<p><%=intl._("At times, it may be helpful to debug I2P by getting a thread dump. To do so, please select the following option and review the thread dumped to <a href=\"logs.jsp#servicelogs\">wrapper.log</a>.")%></p>
<hr><div class="formaction">
<input type="submit" name="action" value="<%=intl._("Dump threads")%>" >
<% } %></div>

View File

@@ -13,9 +13,9 @@
<div class="graphspanel">
<div class="widepanel">
<jsp:useBean class="net.i2p.router.web.GraphHelper" id="graphHelper" scope="request" />
<jsp:setProperty name="graphHelper" property="*" />
<jsp:setProperty name="graphHelper" property="contextId" value="<%=(String)session.getAttribute("i2p.contextId")%>" />
<jsp:setProperty name="graphHelper" property="*" />
<jsp:setProperty name="graphHelper" property="writer" value="<%=out%>" />
<jsp:getProperty name="graphHelper" property="images" />
<jsp:getProperty name="graphHelper" property="form" />
</div></div></div></body></html>
</div></div></div></body></html>

View File

@@ -92,7 +92,12 @@ shared bandwidth, and amount of locally-generated traffic.
The recommended method for limiting participating tunnels is
to change your share percentage on the <a href="config.jsp#help">configuration page</a>.
You may also limit the total number by setting <tt>router.maxParticipatingTunnels=nnn</tt> on
the <a href="configadvanced.jsp">advanced configuration page</a>. <a href="configstats.jsp#tunnel.participatingTunnels">[Enable graphing]</a>.</ul>
the <a href="configadvanced.jsp">advanced configuration page</a>. <a href="configstats.jsp#tunnel.participatingTunnels">[Enable graphing]</a>.
<li class="tidylist"><b>Share ratio:</b>
The number of participating tunnels you route for others, divided by the total number of hops in
all your exploratory and client tunnels.
A number greater than 1.00 means you are contributing more tunnels to the network than you are using.
</ul>
<h3>Congestion</h3><div align="justify">
Some basic indications of router overload:</div><ul>

View File

@@ -0,0 +1,176 @@
<%@page contentType="text/html"%>
<%@page pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<%
/*
* Do not tag this file for translation - copy it to help_xx.jsp and translate inline.
*/
%>
<html><head><title>Консоль маршрутизатора I2P - справка</title>
<%@include file="css.jsi" %>
</head><body>
<%@include file="summary.jsi" %>
<h1>Справка маршрутизатора I2P</h1>
<div class="main" id="main">
<p> Если Вы хотите помочь в улучшении или переводе документации, если у Вас есть идеи, как еще помочь проекту, пожалуйста, загляните в раздел документации
<a href="http://www.i2p2.i2p/getinvolved.html">как стать участником</a>. </p>
<p>Дальнейшие инструкции доступны в <a href="http://www.i2p2.i2p/faq.html">FAQ на www.i2p2.i2p</a>
<br>Также, имеет смысл зайти на <a href="http://forum.i2p/">форум I2P</a> и IRC-каналы проекта.</p>
<h2>Описание статусной панели</h2>
<p>
Для большинства параметров на статусной панели можно <a href="configstats.jsp">настроить</a> построение <a href="graphs.jsp">графиков</a> в целях более подробного анализа.
</p>
<h3>Общая информация</h3><ul>
<li class="tidylist"><b>Локальный идентификатор</b>
Первые 4 символа (24 бита) из Вашего 44-символьного (256-битного) Base64 хеша маршрутизатора. Полный хеш показывается на странице <a href="netdb.jsp?r=.">информации о маршрутизаторе</a>. Никогда никому не показывайте хеш своего маршрутизатора, так как в нем содержится информация о Вашем IP-адресе.
<li class="tidylist"><b>Версия:</b>
Версия Вашего I2P маршрутизатора.
<li class="tidylist"><b>Время:</b>
Текущее время (UTC) и величина рассинхронизации времени (если есть). Для правильной работы I2P нужно точное системное время. Пожалуйста, поправьте системное время, если расхождение приближается к 1-ой минуте.
<li class="tidylist"><b>Доступность:</b>
Результат проверки Вашим маршрутизатором, насколько он открыт для входящих соединений от маршрутизаторов других пользователей. Подробнее смотрите на <a href="config.jsp#help">странице сетевых настроек</a>.
</ul>
<h3>Пиры</h3><ul>
<li class="tidylist"><b>Активные:</b>
Первое число — это количество пиров, с которыми происходил обмен сообщениями за последние несколько минут. Значение может меняться от 8-10 до нескольких сотен в зависимости от Вашего общего трафика, доли транзитного трафика, локально создаваемого трафика. Второе число — это количество пиров, наблюдавшихся за последний час. Не волнуйтесь, если эти числа сильно меняются. Это нормально. <a href="configstats.jsp#router.activePeers">[Включить построение графика]</a>.
<li class="tidylist"><b>Быстрые:</b>
Количество пиров, которые используются Вашим маршрутизатором для построения клиентских туннелей. В общем случае это значение будет в диапазоне 8-15. Список быстрых пиров можно посмотреть на странице <a href="profiles.jsp">профили</a>. <a href="configstats.jsp#router.fastPeers">[Включить построение графика]</a>.
<li class="tidylist"><b>Высокоёмкие:</b>
Количество пиров, которые используются Вашим маршрутизатором для построения части зондирующих туннелей. В общем случае это значение будет в диапазоне 8-25. Быстрые пиры входят в группу высокоёмких. Список высокоёмких пиров можно посмотреть на странице <a href="profiles.jsp">профили</a>. <a href="configstats.jsp#router.highCapacityPeers">[Включить построение графика]</a>.
<li class="tidylist"><b>Хорошо интегрированные:</b>
Количество пиров, которые используются Вашим маршрутизатором для запросов к сетевой базе данных. Обычно в таком качестве выступают «floodfill» пиры. Список хорошо интегрированных пиров можно посмотреть в конце страницы <a href="profiles.jsp">профили</a>.
<li class="tidylist"><b>Известные:</b>
Это общее количество пиров известных Вашему маршрутизатору. Их список показывается на странице <a href="netdb.jsp">обзор сетевой базы данных</a>. Это значение может варьироваться от десятков до тысяч. Значение не соответствует реальному полному размеру сети, так как маршрутизатору в сети I2P достаточно знать лишь часть других маршрутизаторов. Значение зависит от Вашего общего трафика, доли транзитного трафика, локально создаваемого трафика.
</ul>
<h3>Трафик (входящий/исходящий)</h3>
<div align="justify">
Все значения показаны в байтах/секунду. Настроить ограничения трафика можно на странице <a href="config.jsp">сетевых настроек</a>.
Для трафика по умолчанию включено <a href="graphs.jsp">построение графиков</a>.</div>
<h3>Локальные туннели</h3>
<div align="justify">
Локальные приложения, выходящие в I2P сеть через Ваш маршрутизатор. Это могут быть клиенты, запущенные через <a href="i2ptunnel/index.jsp">менеджер туннелей</a>, внешние программы, подключающиеся через интерфейсы SAM, BOB или напрямую через I2CP.
</div>
<h3>Туннели (входящие/исходящие)</h3>
<div align="justify">
Список туннелей можно посмотреть на странице <a href="tunnels.jsp">обзор туннелей</a>.</div>
<ul>
<li class="tidylist"><div align="justify"><b>Зондирующие:</b>
Туннели, созданные Вашим маршрутизатором для связи с floodfill-пирами, тестирования уже существующих туннелей и построения новых.</div>
<li class="tidylist"><b>Клиентские:</b>
Туннели, созданные Вашим маршрутизатором для каждого локального клиента.
<li class="tidylist"><b>Транзитные:</b>
Туннели, построенные другими маршрутизаторами, проходящие через Ваш маршрутизатор. Их количество может сильно варьироваться в зависимости от потребностей сети, настроенной доли транзитного трафика и объема локально создаваемого трафика. Рекомендуемый способ ограничения количества транзитных туннелей — настроить долю транзитного трафика на странице <a href="config.jsp#help">сетевых настроек</a>. Также можно задать точный ограничитель количества через параметр <tt>router.maxParticipatingTunnels=nnn</tt> на странице <a href="configadvanced.jsp">дополнительных настроек</a>.
<a href="configstats.jsp#tunnel.participatingTunnels">[Включить построение графика]</a>.
<li class="tidylist"><b>Доля транзита:</b>
Количество транзитных туннелей, проходящих через Ваш маршрутизатор, поделенное на суммарное количество хопов в Ваших зондирующих и клиентских туннелях. Значение больше 1.00 означает, что Вы предоставляете для сети больше туннелей, чем используете сами.
</ul>
<h3>Занятость</h3>
<div align="justify">Некоторые базовые индикаторы перегруженности маршрутизатора:</div>
<ul>
<li class="tidylist"><b>Задержка заданий:</b>
Как долго задания ожидают выполнения. Содержимое очереди можно посмотреть на странице <a href="jobs.jsp">очередь заданий</a>. К сожалению, есть ещё несколько внутренних очередей, статус которых в консоли не показывается. Задержка заданий в нормальной ситуации должна быть нулевой. Если она систематически выше 500ms, то либо Ваш компьютер слишком медленный, либо с Вашим маршрутизатором проблемы.
<a href="configstats.jsp#jobQueue.jobLag">[Включить построение графика]</a>.
<li class="tidylist"><b>Задержка сообщений:</b>
Как долго исходящие сообщения находятся в очереди. В нормальном случае эта задержка должна быть не выше нескольких сотен миллисекунд. Если она систематически выше 1000ms, то либо Ваш компьютер слишком медленный, либо Вам следует перенастроить ограничение скорости, либо локальные клиенты (чаще всего bittorrent) посылают слишком много данных. Для таких клиентов имеет смысл ограничить скорость.
<a href="configstats.jsp#transport.sendProcessingTime">[Включить построение графика]</a> (transport.sendProcessingTime).
<li class="tidylist"><b>Задержка туннелей:</b>
Время прохождения сигнала при проверке туннеля (сообщение посылается от клиентского туннеля до зондирующего или в обратном направлении). Это значение в нормальном случае должно быть ниже 5 секунд. Если оно систематически выше, то либо Ваш компьютер слишком медленный, либо Вам следует перенастроить ограничение скорости, либо с сетью что-то не в порядке.
<a href="configstats.jsp#tunnel.testSuccessTime">[Включить построение графика]</a> (tunnel.testSuccessTime).
<li class="tidylist"><b>Очередь запросов:</b>
Количество пока необработанных запросов от других маршрутизаторов о построении транзитных туннелей через Ваш маршрутизатор. В нормальном случае это значение должно быть около нуля. Если оно систематически выше, то Ваш компьютер слишком медленный и Вам следует настроить меньшую долю транзитного трафика.
<li class="tidylist"><b>Принимаем/Не принимаем туннели:</b>
Состояние Вашего маршрутизатора по приему или отклонению запросов от других маршрутизаторов о построении туннелей. Ваш маршрутизатор может принимать все запросы, принимать/отклонять часть запросов или отклонять все запросы, в зависимости от сетевой загрузки, нагрузки на процессор и необходимости резервировать полосу пропускания для локальных клиентов.
</ul>
<h2>Лицензии</h2>
<p>Код I2P-маршрутизатора (router.jar) и его SDK (i2p.jar) находятся в общественном достоянии с некоторыми исключениями:</p>
<ul>
<li class="tidylist">Код для алгоритмов ElGamal и DSA — под лицензией BSD, автор: TheCrypto</li>
<li class="tidylist">Код для алгоритмов SHA256 и HMAC-SHA256 — под лицензией MIT, автор: Legion из Bouncycastle</li>
<li class="tidylist">Код для алгоритма AES — под лицензией Cryptix (MIT), авторы: Cryptix team</li>
<li class="tidylist">Код для SNTP — под лицензией BSD, автор: Adam Buckley</li>
<li class="tidylist">Всё остальное полностью в общественном достоянии, авторы: jrandom, mihi, hypercubus, oOo, ugha, duck, shendaras, и другие.</li>
</ul>
<p>Поверх I2P маршрутизатора работают различные приложения-клиенты, каждое со своим набором лицензий и зависимостей. Например, эта страница входит в приложение консоли маршрутизатора, которое сделано из усеченной версии <a href="http://jetty.mortbay.com/jetty/index.html">Jetty</a> (в сборку не включены демонстрационные приложения и прочие дополнения, настройки упрощены). Jetty позволяет запускать в составе маршрутизатора стандартные JSP/сервлеты. Jetty использует javax.servlet.jar разработанный в составе проекта Apache (http://www.apache.org/).
</p>
<p>Ещё одно приложение на этой странице — <a href="http://www.i2p2.i2p/i2ptunnel">I2PTunnel</a> (а тут <a href="i2ptunnel/" target="_blank">его вебинтерфейс</a>). Автор mihi, лицензия GPL. I2PTunnel занимается туннелированнием обычного TCP/IP трафика через I2P (может применяться для eepproxy и irc-прокси). <a href="http://susi.i2p/">susimail</a> — почтовый клиент с <a href="susimail/susimail">вебинтерфейсом</a>, автор susi23, лицензия GPL. Адресная книга помогает управлять содержимым Ваших hosts.txt файлов (подробнее см. ./addressbook/), автор <a href="http://ragnarok.i2p/">Ragnarok</a>.</p>
<p>В поставку маршрутизатора включен <a href="http://www.i2p2.i2p/sam">SAM</a> интерфейс, автор human, приложение в общественном достоянии. SAM предназначен для использования приложениями-клиентами, такими как <a href="http://duck.i2p/i2p-bt/">bittorrent-клиенты</a>. Маршрутизатором используется оптимизированная под разные PC-архитектуры библиотека для вычислений с большими числами jbigi, которая в свою очередь использует библиотеку <a href="http://swox.com/gmp/">GMP</a> (LGPL лицензия). Вспомогательные приложения для Windows созданы с использованием <a href="http://launch4j.sourceforge.net/">Launch4J</a>, а инсталлятор собран при помощи <a href="http://www.izforge.com/izpack/">IzPack</a>. Подробнее о других доступных приложениях и их лицензиях смотрите на странице <a href="http://www.i2p2.i2p/licenses">I2P Software Licenses</a>. Исходный код I2P маршрутизатора и идущих в комплекте приложений можно найти на нашей <a href="http://www.i2p2.i2p/download">странице загрузки</a>. </p>
<h2>История версий</h2>
<jsp:useBean class="net.i2p.router.web.ContentHelper" id="contenthelper" scope="request" />
<% java.io.File fpath = new java.io.File(net.i2p.I2PAppContext.getGlobalContext().getBaseDir(), "history.txt"); %>
<jsp:setProperty name="contenthelper" property="page" value="<%=fpath.getAbsolutePath()%>" />
<jsp:setProperty name="contenthelper" property="maxLines" value="256" />
<jsp:setProperty name="contenthelper" property="startAtBeginning" value="true" />
<jsp:getProperty name="contenthelper" property="textContent" />
<p>Более подробный список изменений можно найти в файле history.txt в каталоге Вашего I2P.
</p><hr></div></body></html>

View File

@@ -51,7 +51,7 @@ if ( !rendered && ((rs != null) || fakeBw) ) {
boolean hideGrid = Boolean.valueOf(""+request.getParameter("hideGrid")).booleanValue();
boolean hideTitle = Boolean.valueOf(""+request.getParameter("hideTitle")).booleanValue();
boolean showEvents = Boolean.valueOf(""+request.getParameter("showEvents")).booleanValue();
boolean showCredit = true;
boolean showCredit = false;
if (request.getParameter("showCredit") != null)
showCredit = Boolean.valueOf(""+request.getParameter("showCredit")).booleanValue();
if (fakeBw)

View File

@@ -9,7 +9,7 @@ msgstr ""
"Project-Id-Version: I2P routerconsole\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2009-11-01 02:59+0000\n"
"PO-Revision-Date: 2009-12-04 22:22+0100\n"
"PO-Revision-Date: 2010-01-17 22:09+0100\n"
"Last-Translator: \n"
"Language-Team: foo <foo@bar>\n"
"MIME-Version: 1.0\n"
@@ -90,7 +90,7 @@ msgstr "Limiteur de bande passante"
#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:299
msgid "I2P will work best if you configure your rates to match the speed of your internet connection."
msgstr ""
msgstr "I2P fonctionnera mieux si vous configurez le débit de transmission et réception pour qu'ils soient égales à ceux de votre connexion internet."
#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:303
msgid "KBps In"
@@ -117,15 +117,15 @@ msgstr "Vous avez configuré I2P à partager que {0} KOps."
#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:335
msgid "I2P requires at least 12KBps to enable sharing. "
msgstr ""
msgstr "I2P a besoin de plus de 12KOps afin d'activer le partage de bande passante"
#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:336
msgid "Please enable sharing (participating in tunnels) by configuring more bandwidth. "
msgstr ""
msgstr "Veuillez activer le partage de bande passante (tunnels participants) en augmentant votre bande passante."
#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:337
msgid "It improves your anonymity by creating cover traffic, and helps the network."
msgstr ""
msgstr "Cela aidera votre anonymat en cachant vos données parmi les données des autres, et cela améliorera le réseau."
#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:340
#, java-format
@@ -134,7 +134,7 @@ msgstr "Vous avez configuré I2P à partager {0} KOps."
#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:343
msgid "The higher the share bandwidth the more you improve your anonymity and help the network."
msgstr ""
msgstr "En partageant plus de votre bande passante, vous améliorerez votre anonymat et le réseau."
#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:347
#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:478
@@ -165,7 +165,7 @@ msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:355
msgid "The default settings will work for most people."
msgstr ""
msgstr "La configuration par défaut marchera pour la plupart des gens."
#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:357
msgid "There is help below."
@@ -202,7 +202,7 @@ msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:381
msgid "Ignore local interface IP address"
msgstr ""
msgstr "Ignorer l'adresse IP de l'interface locale"
#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:385
msgid "Use SSU IP address detection only"
@@ -211,7 +211,7 @@ msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:389
#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:443
msgid "Specify hostname or IP"
msgstr "Stipuler l'adresse IP ou le nom de l'hôte"
msgstr "Saisir l'adresse IP ou le nom de l'hôte"
#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:395
msgid "Select Interface"
@@ -266,7 +266,7 @@ msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:453
msgid "Completely disable"
msgstr ""
msgstr "Desactiver complètement"
#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:455
msgid "(select only if behind a firewall that throttles or blocks outbound TCP)"
@@ -282,7 +282,7 @@ msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:469
msgid "Specify Port"
msgstr "Stipuler le port"
msgstr "Saisir le port"
#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:473
#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:342
@@ -454,7 +454,7 @@ msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:562
msgid "WARN - Firewalled and Fast"
msgstr ""
msgstr "WARN - Pare-feu et Rapide"
#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:564
msgid "You have configured I2P to share more than 128KBps of bandwidth, but you are firewalled."
@@ -466,7 +466,7 @@ msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:568
msgid "WARN - Firewalled and Floodfill"
msgstr ""
msgstr "WARN - Pare-feu et Floodfill"
#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:570
msgid "You have configured I2P to be a floodfill router, but you are firewalled."
@@ -478,7 +478,7 @@ msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:574
msgid "WARN - Firewalled with Inbound TCP Enabled"
msgstr ""
msgstr "WARN - Pare-feu avec TCP entrant activé"
#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:576
msgid "You have configured inbound TCP, however your UDP port is firewalled, and therefore it is likely that your TCP port is firewalled as well."
@@ -494,7 +494,7 @@ msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:582
msgid "WARN - Firewalled with UDP Disabled"
msgstr ""
msgstr "WARN - Pare-feu avec UDP desactivé"
#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:584
msgid "You have configured inbound TCP, however you have disabled UDP."
@@ -522,7 +522,7 @@ msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:596
msgid "ERR - Private TCP Address"
msgstr ""
msgstr "ERR - Adresse TCP privée"
#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:598
msgid "You must never advertise an unroutable IP address such as 127.0.0.1 or 192.168.1.1 as your external address."
@@ -534,7 +534,7 @@ msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:602
msgid "ERR - SymmetricNAT"
msgstr ""
msgstr "ERR - NAT symétrique"
#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:604
msgid "I2P detected that you are firewalled by a Symmetric NAT."
@@ -881,7 +881,7 @@ msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:300
msgid "This is useful in some situations"
msgstr ""
msgstr "C'est utile dans certains cas"
#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:302
msgid "for example, if you changed some settings that client applications only read at startup, such as the routerconsole password or the interface it listens on."
@@ -1107,7 +1107,7 @@ msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:319
msgid "Please contribute to the router console translation project! Contact the developers on IRC #i2p to help."
msgstr ""
msgstr "Veuillez contribuer à la traduction du 'router console' ! Contactez les développeurs sur IRC #i2p afin de donner un coup de main."
#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:106
msgid "config update"
@@ -1235,7 +1235,7 @@ msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:231
msgid "Please include this information in bug reports"
msgstr ""
msgstr "Veuillez inclure cette information dans les rapports des bugs"
#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:105
msgid "network database summary"
@@ -1308,7 +1308,7 @@ msgstr "Non supportée"
#: src/net/i2p/router/web/ConfigClientsHandler.java:83
msgid "Client configuration saved successfully - restart required to take effect."
msgstr ""
msgstr "La configuration du client a été sauvegardé avec succès - redémarrer pour prendre effet. "
#: src/net/i2p/router/web/ConfigClientsHandler.java:89
msgid "Bad client index."
@@ -1341,7 +1341,7 @@ msgstr "Echec de démarrage"
#: src/net/i2p/router/web/ConfigClientsHandler.java:137
msgid "Failed to find server."
msgstr ""
msgstr "Pas pu trouver un serveur."
#: src/net/i2p/router/web/ConfigClientsHelper.java:17
msgid "Class and arguments"
@@ -1529,7 +1529,7 @@ msgstr ""
#: src/net/i2p/router/web/ConfigNetHandler.java:293
msgid "Updating bandwidth share percentage"
msgstr ""
msgstr "Mise à jour du pourcentage de bande passante partagée"
#: src/net/i2p/router/web/ConfigNetHandler.java:363
msgid "Updated bandwidth limits"
@@ -1557,7 +1557,7 @@ msgstr "Pair"
#: src/net/i2p/router/web/ConfigPeerHandler.java:24
msgid "banned until restart"
msgstr ""
msgstr "interdit jusqu'au rédémarrage"
#: src/net/i2p/router/web/ConfigPeerHandler.java:27
#: src/net/i2p/router/web/ConfigPeerHandler.java:38
@@ -1567,11 +1567,11 @@ msgstr "Pair pas valable"
#: src/net/i2p/router/web/ConfigPeerHandler.java:33
msgid "unbanned"
msgstr ""
msgstr "plus interdit"
#: src/net/i2p/router/web/ConfigPeerHandler.java:35
msgid "is not currently banned"
msgstr ""
msgstr "n'est pas actuellement interdit"
#: src/net/i2p/router/web/ConfigPeerHandler.java:47
msgid "Bad speed value"
@@ -1613,11 +1613,11 @@ msgstr "Redémarrage en {0}"
#: src/net/i2p/router/web/ConfigServiceHandler.java:56
msgid "Graceful shutdown initiated"
msgstr ""
msgstr "Fermature gracieuse initiée"
#: src/net/i2p/router/web/ConfigServiceHandler.java:60
msgid "Shutdown immediately! boom bye bye bad bwoy"
msgstr ""
msgstr "Fermer immédiatement !"
#: src/net/i2p/router/web/ConfigServiceHandler.java:63
msgid "Graceful shutdown cancelled"
@@ -1703,7 +1703,7 @@ msgstr ""
#: src/net/i2p/router/web/ConfigTunnelsHandler.java:142
msgid "Exploratory tunnel configuration saved successfully."
msgstr ""
msgstr "Configuration du tunnel exploratoire a été sauvegardé avec succès."
#: src/net/i2p/router/web/ConfigTunnelsHandler.java:144
#: src/net/i2p/router/web/ConfigUIHandler.java:36
@@ -1818,11 +1818,11 @@ msgstr "Suédois"
#: src/net/i2p/router/web/ConfigUpdateHandler.java:63
msgid "Update available, attempting to download now"
msgstr ""
msgstr "Mise à jour disponible, en tentant de la télécharger actuellement"
#: src/net/i2p/router/web/ConfigUpdateHandler.java:65
msgid "Update available, click button on left to download"
msgstr ""
msgstr "Mise à jour disponible, cliquez sur le bouton sur la gauche pour la télécharger"
#: src/net/i2p/router/web/ConfigUpdateHandler.java:67
msgid "No update available"
@@ -2439,23 +2439,23 @@ msgstr ""
#: src/net/i2p/router/web/SummaryHelper.java:104
msgid "ERR-Private TCP Address"
msgstr ""
msgstr "ERR - Adresse TCP privée"
#: src/net/i2p/router/web/SummaryHelper.java:106
msgid "ERR-SymmetricNAT"
msgstr ""
msgstr "ERR - NAT symétrique"
#: src/net/i2p/router/web/SummaryHelper.java:109
msgid "WARN-Firewalled with Inbound TCP Enabled"
msgstr ""
msgstr "WARN - pare-feu avec TCP entrant activé"
#: src/net/i2p/router/web/SummaryHelper.java:111
msgid "WARN-Firewalled and Floodfill"
msgstr ""
msgstr "WARN - Pare-feu et Floodfill"
#: src/net/i2p/router/web/SummaryHelper.java:113
msgid "WARN-Firewalled and Fast"
msgstr ""
msgstr "WARN - Pare-feu et Rapide"
#: src/net/i2p/router/web/SummaryHelper.java:116
msgid "ERR-UDP Port In Use - Set i2np.udp.internalPort=xxxx in advanced config and restart"
@@ -2467,7 +2467,7 @@ msgstr ""
#: src/net/i2p/router/web/SummaryHelper.java:125
msgid "WARN-Firewalled with UDP Disabled"
msgstr ""
msgstr "WARN - Pare-feu avec UDP desactivé"
#: src/net/i2p/router/web/SummaryHelper.java:360
msgid "Add/remove/edit &amp; control your client and server tunnels"

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

208
build.xml
View File

@@ -197,6 +197,8 @@
<delete file="BOB-one.jar" failonerror="false" quiet="true" />
</target>
<target name="distclean" depends="clean">
<delete dir="debian/tmp" />
<delete file="debian/files" />
<ant dir="core/java/" target="distclean" />
<ant dir="router/java/" target="distclean" />
<ant dir="apps/ministreaming/java/" target="distclean" />
@@ -237,8 +239,7 @@
<defaultexcludes remove="**/*~"/>
<delete>
<fileset dir="." includes="**/*.class" />
<fileset dir="." includes="**/*.java~" />
<fileset dir="." includes="**/*.class **/*.java~ **/*.txt~ **/*.xml~ **/*.sh~ **/*.SlackBuild~" />
<!--
Less common, but they pollute my workspace here, so we
might as well nuke these as well. Are there any others?
@@ -247,82 +248,37 @@
++Sponge
-->
<fileset dir="." includes="**/*.txt~" />
<fileset dir="." includes="**/*.xml~" />
<fileset dir="." includes="**/*.sh~" />
<fileset dir="." includes="**/*.SlackBuild~" />
</delete>
<!--
Now we put the defaults back
-->
<defaultexcludes default="true"/>
</target>
<target name="pkg" depends="distclean, updater, preppkg, installer" />
<!-- A few reeleases only, then back to updater. First release was 0.7.11 -->
<target name="pkg" depends="distclean, updaterWithJettyFixes, preppkg, installer" />
<target name="pkgclean" depends="deletepkg-temp">
<delete>
<fileset dir="." includes="i2p.tar.bz2 install.jar i2pupdate.zip" />
</delete>
</target>
<target name="preppkg" depends="build, buildexe, preplicenses, prepconsoleDocs">
<copy file="build/i2p.jar" todir="pkg-temp/lib/" />
<copy file="build/i2ptunnel.jar" todir="pkg-temp/lib/" />
<copy file="build/jasper-compiler.jar" todir="pkg-temp/lib/" />
<copy file="build/jasper-runtime.jar" todir="pkg-temp/lib/" />
<copy file="build/commons-logging.jar" todir="pkg-temp/lib/" />
<copy file="build/commons-el.jar" todir="pkg-temp/lib/" />
<copy file="build/javax.servlet.jar" todir="pkg-temp/lib/" />
<target name="preppkg" depends="preppkg-linux, buildexe">
<copy file="build/jbigi.jar" todir="pkg-temp/lib" />
<copy file="build/mstreaming.jar" todir="pkg-temp/lib/" />
<copy file="build/streaming.jar" todir="pkg-temp/lib/" />
<copy file="build/org.mortbay.jetty.jar" todir="pkg-temp/lib/" />
<copy file="build/router.jar" todir="pkg-temp/lib/" />
<copy file="build/routerconsole.jar" todir="pkg-temp/lib/" />
<copy file="build/sam.jar" todir="pkg-temp/lib/" />
<copy file="build/BOB.jar" todir="pkg-temp/lib/" />
<copy file="build/systray.jar" todir="pkg-temp/lib" />
<!-- <copy file="build/sucker.jar" todir="pkg-temp/lib" /> -->
<copy file="build/i2psnark.jar" todir="pkg-temp/lib/" />
<copy file="i2p.exe" todir="pkg-temp/" failonerror="false" />
<copy file="installer/resources/runplain.sh" todir="pkg-temp/" />
<copy file="apps/systray/java/lib/systray4j.jar" todir="pkg-temp/lib" />
<copy file="apps/systray/java/lib/systray4j.dll" todir="pkg-temp/lib" />
<copy file="apps/systray/java/resources/iggy.ico" todir="pkg-temp/icons" />
<copy file="apps/systray/java/resources/iggy.xpm" todir="pkg-temp/icons" />
<copy file="build/i2ptunnel.war" todir="pkg-temp/webapps/" />
<copy file="build/routerconsole.war" todir="pkg-temp/webapps/" />
<copy file="build/addressbook.war" todir="pkg-temp/webapps/" />
<copy file="build/susimail.war" todir="pkg-temp/webapps/" />
<copy file="build/susidns.war" todir="pkg-temp/webapps/" />
<!-- <copy file="build/syndie.war" todir="pkg-temp/webapps/" /> -->
<copy file="build/i2psnark.war" todir="pkg-temp/webapps/" />
<copy file="apps/i2psnark/launch-i2psnark" todir="pkg-temp/" />
<copy file="apps/i2psnark/jetty-i2psnark.xml" todir="pkg-temp/" />
<copy file="apps/i2psnark/i2psnark.config" todir="pkg-temp/" />
<copy file="installer/resources/blocklist.txt" todir="pkg-temp/" />
<copy file="installer/resources/clients.config" todir="pkg-temp/" />
<copy file="installer/resources/eepget" todir="pkg-temp/" />
<copy file="installer/resources/i2prouter" todir="pkg-temp/" />
<copy file="installer/resources/eepget.bat" todir="pkg-temp/" />
<copy file="installer/resources/i2prouter.bat" todir="pkg-temp/" />
<copy file="installer/resources/fixperms.bat" todir="pkg-temp/" />
<copy file="installer/resources/i2ptunnel.config" todir="pkg-temp/" />
<!-- <copy file="installer/resources/install_i2p_service_unix" todir="pkg-temp/" /> -->
<copy file="installer/resources/install_i2p_service_winnt.bat" todir="pkg-temp/" />
<copy file="installer/resources/osid" todir="pkg-temp/" />
<copy file="installer/resources/postinstall.bat" todir="pkg-temp/" />
<copy file="installer/resources/postinstall.sh" todir="pkg-temp/" />
<copy file="installer/resources/systray.config" todir="pkg-temp/" />
<!-- <copy file="installer/resources/uninstall_i2p_service_unix" todir="pkg-temp/" /> -->
<copy file="installer/resources/uninstall_i2p_service_winnt.bat" todir="pkg-temp/" />
<copy file="installer/resources/wrapper.config" todir="pkg-temp/" />
<copy todir="pkg-temp/lib/wrapper/freebsd/">
<fileset dir="installer/lib/wrapper/freebsd/" />
</copy>
<copy todir="pkg-temp/lib/wrapper/linux/">
<fileset dir="installer/lib/wrapper/linux/" />
</copy>
<copy todir="pkg-temp/lib/wrapper/linux64/">
<fileset dir="installer/lib/wrapper/linux64/" />
</copy>
<copy todir="pkg-temp/lib/wrapper/macosx/">
<fileset dir="installer/lib/wrapper/macosx/" />
</copy>
@@ -332,19 +288,68 @@
<copy todir="pkg-temp/lib/wrapper/win32/">
<fileset dir="installer/lib/wrapper/win32/" />
</copy>
</target>
<!-- only what is needed for debian, etc. -->
<target name="preppkg-linux-only" depends="preppkg-linux">
<!-- rip the non-linux stuff out of jbigi.jar -->
<mkdir dir="tmpextract" />
<unjar src="build/jbigi.jar" dest="tmpextract/" />
<jar destfile="pkg-temp/lib/jbigi.jar" >
<fileset dir="tmpextract/" includes="*linux*" />
</jar>
<delete dir="tmpextract/" />
</target>
<target name="preppkg-linux" depends="build, preplicenses, prepconsoleDocs">
<copy file="build/i2p.jar" todir="pkg-temp/lib/" />
<copy file="build/i2ptunnel.jar" todir="pkg-temp/lib/" />
<copy file="build/jasper-compiler.jar" todir="pkg-temp/lib/" />
<copy file="build/jasper-runtime.jar" todir="pkg-temp/lib/" />
<copy file="build/commons-logging.jar" todir="pkg-temp/lib/" />
<copy file="build/commons-el.jar" todir="pkg-temp/lib/" />
<copy file="build/javax.servlet.jar" todir="pkg-temp/lib/" />
<copy file="build/mstreaming.jar" todir="pkg-temp/lib/" />
<copy file="build/streaming.jar" todir="pkg-temp/lib/" />
<copy file="build/org.mortbay.jetty.jar" todir="pkg-temp/lib/" />
<copy file="build/router.jar" todir="pkg-temp/lib/" />
<copy file="build/routerconsole.jar" todir="pkg-temp/lib/" />
<copy file="build/sam.jar" todir="pkg-temp/lib/" />
<copy file="build/BOB.jar" todir="pkg-temp/lib/" />
<copy file="build/systray.jar" todir="pkg-temp/lib" />
<copy file="build/i2psnark.jar" todir="pkg-temp/lib/" />
<copy file="installer/resources/runplain.sh" todir="pkg-temp/" />
<copy file="apps/systray/java/lib/systray4j.jar" todir="pkg-temp/lib" />
<copy file="build/i2ptunnel.war" todir="pkg-temp/webapps/" />
<copy file="build/routerconsole.war" todir="pkg-temp/webapps/" />
<copy file="build/addressbook.war" todir="pkg-temp/webapps/" />
<copy file="build/susimail.war" todir="pkg-temp/webapps/" />
<copy file="build/susidns.war" todir="pkg-temp/webapps/" />
<copy file="build/i2psnark.war" todir="pkg-temp/webapps/" />
<copy file="apps/i2psnark/launch-i2psnark" todir="pkg-temp/" />
<copy file="apps/i2psnark/jetty-i2psnark.xml" todir="pkg-temp/" />
<copy file="apps/i2psnark/i2psnark.config" todir="pkg-temp/" />
<copy file="installer/resources/blocklist.txt" todir="pkg-temp/" />
<copy file="installer/resources/clients.config" todir="pkg-temp/" />
<copy file="installer/resources/eepget" todir="pkg-temp/" />
<copy file="installer/resources/i2prouter" todir="pkg-temp/" />
<copy file="installer/resources/i2ptunnel.config" todir="pkg-temp/" />
<copy file="installer/resources/osid" todir="pkg-temp/" />
<copy file="installer/resources/postinstall.sh" todir="pkg-temp/" />
<copy file="installer/resources/systray.config" todir="pkg-temp/" />
<copy file="installer/resources/wrapper.config" todir="pkg-temp/" />
<copy todir="pkg-temp/lib/wrapper/linux/">
<fileset dir="installer/lib/wrapper/linux/" />
</copy>
<copy todir="pkg-temp/lib/wrapper/linux64/">
<fileset dir="installer/lib/wrapper/linux64/" />
</copy>
<copy file="installer/resources/hosts.txt" todir="pkg-temp/" />
<copy file="INSTALL-headless.txt" todir="pkg-temp/" />
<!-- overwrite the truncated history put in by the updater -->
<copy file="history.txt" todir="pkg-temp/" overwrite="true" />
<mkdir dir="pkg-temp/scripts" />
<copy file="apps/proxyscript/i2pProxy.pac" todir="pkg-temp/scripts/" />
<!-- test classes aren't in the jars anymore
<copy file="core/perl/i2pbench.sh" todir="pkg-temp/scripts/" />
<copy file="core/perl/i2ptest.sh" todir="pkg-temp/scripts/" />
-->
<!-- polecat: please put your modified toolbar.html in installer/resources/toolbar.html
and uncomment the following -->
<!-- <copy file="installer/resources/toolbar.html" todir="pkg-temp/docs/" /> -->
<!-- overwrite the news put in by the updater -->
<copy file="installer/resources/initialNews.xml" tofile="pkg-temp/docs/news.xml" overwrite="true" />
<copy file="installer/resources/startconsole.html" todir="pkg-temp/docs/" />
@@ -355,18 +360,21 @@
<copy todir="pkg-temp/docs/themes/" >
<fileset dir="installer/resources/themes/" />
</copy>
<!-- Eepsite stuff here -->
<mkdir dir="pkg-temp/eepsite" />
<mkdir dir="pkg-temp/eepsite/webapps" />
<mkdir dir="pkg-temp/eepsite/logs" />
<mkdir dir="pkg-temp/eepsite/docroot" />
<mkdir dir="pkg-temp/eepsite/cgi-bin" />
<copy file="installer/resources/eepsite_index.html" tofile="pkg-temp/eepsite/docroot/index.html" />
<copy file="installer/resources/eepsite_index_de.html" tofile="pkg-temp/eepsite/docroot/index_de.html" />
<copy file="installer/resources/eepsite.css" todir="pkg-temp/eepsite/docroot/" />
<copy file="installer/resources/robots.txt" todir="pkg-temp/eepsite/docroot/" />
<mkdir dir="pkg-temp/eepsite/docroot" />
<mkdir dir="pkg-temp/eepsite/docroot/help" />
<mkdir dir="pkg-temp/eepsite/docroot/help/lib" />
<copy todir="pkg-temp/eepsite/docroot/" >
<fileset dir="installer/resources/eepsite.help/" includes="robots.txt index.html help/pagetemplate.html help/index*.html **/*.png **/*.css" />
</copy>
<copy file="installer/resources/themes/console/images/favicon.ico" tofile="pkg-temp/eepsite/docroot/favicon.ico" />
<copy file="installer/resources/jetty.xml" tofile="pkg-temp/eepsite/jetty.xml" />
</target>
<target name="preplicenses">
<copy file="LICENSE.txt" todir="pkg-temp/" />
<copy todir="pkg-temp/licenses/" >
@@ -646,7 +654,7 @@
<target name="release" depends="pkg">
<echo message="================================================================" />
<echo message="Did you update these files?" />
<exec executable="ls">
<exec executable="ls" failonerror="true">
<arg value="-l" />
<arg value="history.txt" />
<arg value="installer/resources/initialNews.xml" />
@@ -656,15 +664,19 @@
<arg value="router/java/src/net/i2p/router/RouterVersion.java" />
</exec>
<echo message="Everything is checked in, right? Let's be sure:" />
<exec executable="mtn">
<exec executable="mtn" failonerror="true">
<arg value="st" />
</exec>
<input message="Enter new version number:" addproperty="release.number" />
<fail message="You must enter a version number." >
<condition>
<equals arg1="${release.number}" arg2=""/>
</condition>
</fail>
<echo message="If there are any modified files above, stop now!" />
<!-- get release version number -->
<exec executable="grep" outputproperty="versionLine" failonerror="true" >
<arg value="public final static String VERSION" />
<arg value="core/java/src/net/i2p/CoreVersion.java" />
</exec>
<exec executable="cut" inputstring="${versionLine}" outputproperty="release.number" failonerror="true" >
<arg value="-f2" />
<arg value="-d&quot;" />
</exec>
<echo message="New version number is ${release.number}" />
<copy file="i2pupdate.zip" tofile="i2pupdate_${release.number}.zip" />
<copy file="i2pinstall.exe" tofile="i2pinstall_${release.number}.exe" />
@@ -707,15 +719,18 @@
<arg value="i2pupdate.sud" />
</java>
<!-- will this use the monotonerc file in the current workspace? -->
<echo message="Checking out fresh copy into ../i2p-${release-number} for tarballing:" />
<echo message="Checking out fresh copy into ../i2p-${release.number} for tarballing:" />
<delete dir="../i2p-${release.number}" />
<exec executable="mtn">
<exec executable="mtn" failonerror="true">
<arg value="co" />
<arg value="-b" />
<arg value="i2p.i2p" />
<!-- w: is the revision of the current workspace -->
<arg value="-r" />
<arg value="w:" />
<arg value="../i2p-${release.number}/" />
</exec>
<exec executable="tar">
<exec executable="tar" failonerror="true">
<arg value="cjf" />
<arg value="i2psource_${release.number}.tar.bz2" />
<arg value="-C" />
@@ -728,20 +743,20 @@
<delete file="i2pinstall_${release.number}.exe.sig" />
<delete file="i2psource_${release.number}.tar.bz2.sig" />
<delete file="i2pupdate_${release.number}.zip.sig" />
<exec executable="gpg">
<exec executable="gpg" failonerror="true">
<arg value="-b" />
<arg value="i2pinstall_${release.number}.exe" />
</exec>
<exec executable="gpg">
<exec executable="gpg" failonerror="true">
<arg value="-b" />
<arg value="i2psource_${release.number}.tar.bz2" />
</exec>
<exec executable="gpg">
<exec executable="gpg" failonerror="true">
<arg value="-b" />
<arg value="i2pupdate_${release.number}.zip" />
</exec>
<echo message="File sizes:" />
<exec executable="ls">
<exec executable="ls" failonerror="true">
<arg value="-l" />
<arg value="i2pinstall_${release.number}.exe" />
<arg value="i2psource_${release.number}.tar.bz2" />
@@ -752,12 +767,39 @@
<arg value="i2pupdate_${release.number}.zip.sig" />
</exec>
<echo message="SHA256 sums:" />
<exec executable="sha256sum">
<exec executable="sha256sum" failonerror="true">
<arg value="i2pinstall_${release.number}.exe" />
<arg value="i2psource_${release.number}.tar.bz2" />
<arg value="i2pupdate_${release.number}.zip" />
<arg value="i2pupdate.sud" />
</exec>
<echo message="Don't forget to mtn tag h: i2p-${release-number}" />
<echo message="Don't forget to mtn tag w: i2p-${release.number}" />
<echo message="... and mtn cert t:i2p-${release.number} branch i2p.i2p.release" />
</target>
<target name="debian">
<!-- binary only -->
<echo message="Did you update the version in these files?" />
<exec executable="ls" failonerror="true">
<arg value="-l" />
<arg value="debian/changelog" />
</exec>
<echo message="====================" />
<exec executable="dpkg-buildpackage" failifexecutionfails="true" >
<arg value="-b" />
</exec>
</target>
<target name="debian-source">
<!-- bundle the 20MB jetty 5 lib since there probably isn't a deb for it -->
<ant dir="apps/jetty" target="verifyJettylib" />
<echo message="Did you update the version in these files?" />
<exec executable="ls" failonerror="true">
<arg value="-l" />
<arg value="debian/changelog" />
</exec>
<echo message="====================" />
<exec executable="dpkg-buildpackage" failifexecutionfails="true" >
<arg value="-S" />
<arg value="-I_MTN" />
</exec>
</target>
</project>

View File

@@ -16,7 +16,7 @@ package net.i2p;
public class CoreVersion {
/** deprecated */
public final static String ID = "Monotone";
public final static String VERSION = "0.7.8";
public final static String VERSION = "0.7.10";
public static void main(String args[]) {
System.out.println("I2P Core version: " + VERSION);

View File

@@ -25,10 +25,10 @@ abstract class HandlerImpl implements I2CPMessageHandler {
public HandlerImpl(I2PAppContext context, int type) {
_context = context;
_type = type;
_log = new Log(getClass());
_log = context.logManager().getLog(getClass());
}
public int getType() {
return _type;
}
}
}

View File

@@ -27,7 +27,11 @@ class SetDateMessageHandler extends HandlerImpl {
public void handleMessage(I2CPMessage message, I2PSessionImpl session) {
_log.debug("Handle message " + message);
SetDateMessage msg = (SetDateMessage) message;
Clock.getInstance().setNow(msg.getDate().getTime());
// Only do this if we are NOT in the router context;
// otherwise, it sets getUpdatedSuccessfully() in Clock when all
// we did was get the time from ourselves.
if (!_context.isRouterContext())
Clock.getInstance().setNow(msg.getDate().getTime());
session.dateUpdated();
}
}
}

View File

@@ -48,7 +48,18 @@ public final class I2PDatagramMaker {
sxPrivKey = session.getPrivateKey();
sxDestBytes = session.getMyDestination().toByteArray();
}
/**
* Construct a new I2PDatagramMaker that is null.
* Use setI2PDatagramMaker to set the parameters.
*/
public I2PDatagramMaker() {
// nop
}
public void setI2PDatagramMaker(I2PSession session) {
sxPrivKey = session.getPrivateKey();
sxDestBytes = session.getMyDestination().toByteArray();
}
/**
* Make a repliable I2P datagram containing the specified payload.
*

View File

@@ -64,16 +64,16 @@ public class Address extends DataStructureImpl {
@Override
public int hashCode() {
return DataHelper.hashCode(getHostname())
+ DataHelper.hashCode(getDestination());
return DataHelper.hashCode(_hostname)
+ DataHelper.hashCode(_destination);
}
@Override
public String toString() {
StringBuilder buf = new StringBuilder(64);
buf.append("[Address: ");
buf.append("\n\tHostname: ").append(getHostname());
buf.append("\n\tDestination: ").append(getDestination());
buf.append("\n\tHostname: ").append(_hostname);
buf.append("\n\tDestination: ").append(_destination);
buf.append("]");
return buf.toString();
}

View File

@@ -140,11 +140,11 @@ public class Certificate extends DataStructureImpl {
public boolean equals(Object object) {
if ((object == null) || !(object instanceof Certificate)) return false;
Certificate cert = (Certificate) object;
return getCertificateType() == cert.getCertificateType() && DataHelper.eq(getPayload(), cert.getPayload());
return _type == cert.getCertificateType() && DataHelper.eq(_payload, cert.getPayload());
}
@Override
public int hashCode() {
return getCertificateType() + DataHelper.hashCode(getPayload());
return _type + DataHelper.hashCode(_payload);
}
@Override
public String toString() {

View File

@@ -48,8 +48,8 @@ import net.i2p.util.ReusableGZIPOutputStream;
* @author jrandom
*/
public class DataHelper {
private final static byte _equalBytes[] = "=".getBytes(); // in UTF-8
private final static byte _semicolonBytes[] = ";".getBytes(); // in UTF-8
private final static byte EQUAL_BYTES[] = "=".getBytes(); // in UTF-8
private final static byte SEMICOLON_BYTES[] = ";".getBytes(); // in UTF-8
/** Read a mapping from the stream, as defined by the I2P data structure spec,
* and store it into a Properties object.
@@ -76,17 +76,17 @@ public class DataHelper {
int read = read(rawStream, data);
if (read != size) throw new DataFormatException("Not enough data to read the properties");
ByteArrayInputStream in = new ByteArrayInputStream(data);
byte eqBuf[] = new byte[_equalBytes.length];
byte semiBuf[] = new byte[_semicolonBytes.length];
byte eqBuf[] = new byte[EQUAL_BYTES.length];
byte semiBuf[] = new byte[SEMICOLON_BYTES.length];
while (in.available() > 0) {
String key = readString(in);
read = read(in, eqBuf);
if ((read != eqBuf.length) || (!eq(eqBuf, _equalBytes))) {
if ((read != eqBuf.length) || (!eq(eqBuf, EQUAL_BYTES))) {
break;
}
String val = readString(in);
read = read(in, semiBuf);
if ((read != semiBuf.length) || (!eq(semiBuf, _semicolonBytes))) {
if ((read != semiBuf.length) || (!eq(semiBuf, SEMICOLON_BYTES))) {
break;
}
props.put(key, val);
@@ -123,7 +123,7 @@ public class DataHelper {
if (props != null) {
OrderedProperties p = new OrderedProperties();
p.putAll(props);
ByteArrayOutputStream baos = new ByteArrayOutputStream(32);
ByteArrayOutputStream baos = new ByteArrayOutputStream(p.size() * 64);
for (Iterator iter = p.keySet().iterator(); iter.hasNext();) {
String key = (String) iter.next();
String val = p.getProperty(key);
@@ -131,15 +131,17 @@ public class DataHelper {
writeStringUTF8(baos, key);
else
writeString(baos, key);
baos.write(_equalBytes);
baos.write(EQUAL_BYTES);
if (utf8)
writeStringUTF8(baos, val);
else
writeString(baos, val);
baos.write(_semicolonBytes);
baos.write(SEMICOLON_BYTES);
}
baos.close();
byte propBytes[] = baos.toByteArray();
if (propBytes.length > 65535)
throw new DataFormatException("Properties too big (65535 max): " + propBytes.length);
writeLong(rawStream, 2, propBytes.length);
rawStream.write(propBytes);
} else {
@@ -164,9 +166,9 @@ public class DataHelper {
//key = new String(key.getBytes(), "UTF-8");
//val = new String(val.getBytes(), "UTF-8");
writeString(baos, key);
baos.write(_equalBytes);
baos.write(EQUAL_BYTES);
writeString(baos, val);
baos.write(_semicolonBytes);
baos.write(SEMICOLON_BYTES);
}
baos.close();
byte propBytes[] = baos.toByteArray();
@@ -190,17 +192,17 @@ public class DataHelper {
int size = (int)fromLong(source, offset, 2);
offset += 2;
ByteArrayInputStream in = new ByteArrayInputStream(source, offset, size);
byte eqBuf[] = new byte[_equalBytes.length];
byte semiBuf[] = new byte[_semicolonBytes.length];
byte eqBuf[] = new byte[EQUAL_BYTES.length];
byte semiBuf[] = new byte[SEMICOLON_BYTES.length];
while (in.available() > 0) {
String key = readString(in);
int read = read(in, eqBuf);
if ((read != eqBuf.length) || (!eq(eqBuf, _equalBytes))) {
if ((read != eqBuf.length) || (!eq(eqBuf, EQUAL_BYTES))) {
break;
}
String val = readString(in);
read = read(in, semiBuf);
if ((read != semiBuf.length) || (!eq(semiBuf, _semicolonBytes))) {
if ((read != semiBuf.length) || (!eq(semiBuf, SEMICOLON_BYTES))) {
break;
}
target.put(key, val);
@@ -280,8 +282,13 @@ public class DataHelper {
String val = line.substring(split+1); //.trim() ??????????????
// Unescape line breaks after loading.
// Remember: "\" needs escaping both for regex and string.
val = val.replaceAll("\\\\r","\r");
val = val.replaceAll("\\\\n","\n");
// For some reason this was turning \r (one backslash) into CR,
// I think it needed one more \\ in the pattern?,
// which sucks if your username is randy on DOS,
// it was a horrible idea anyway
//val = val.replaceAll("\\\\r","\r");
//val = val.replaceAll("\\\\n","\n");
if ( (key.length() > 0) && (val.length() > 0) )
if (forceLowerCase)
props.setProperty(key.toLowerCase(), val);

View File

@@ -129,9 +129,9 @@ public class Destination extends DataStructureImpl {
public boolean equals(Object object) {
if ((object == null) || !(object instanceof Destination)) return false;
Destination dst = (Destination) object;
return DataHelper.eq(getCertificate(), dst.getCertificate())
&& DataHelper.eq(getSigningPublicKey(), dst.getSigningPublicKey())
&& DataHelper.eq(getPublicKey(), dst.getPublicKey());
return DataHelper.eq(_certificate, dst.getCertificate())
&& DataHelper.eq(_signingKey, dst.getSigningPublicKey())
&& DataHelper.eq(_publicKey, dst.getPublicKey());
}
/** the public key has enough randomness in it to use it by itself for speed */

View File

@@ -77,11 +77,13 @@ public class Lease extends DataStructureImpl {
* Transient attribute of the lease, used to note how many times messages sent
* to the destination through the current lease were successful.
*
* @deprecated unused
*/
public int getNumSuccess() {
return _numSuccess;
}
/** @deprecated unused */
public void setNumSuccess(int num) {
_numSuccess = num;
}
@@ -90,11 +92,13 @@ public class Lease extends DataStructureImpl {
* Transient attribute of the lease, used to note how many times messages sent
* to the destination through the current lease failed.
*
* @deprecated unused
*/
public int getNumFailure() {
return _numFailure;
}
/** @deprecated unused */
public void setNumFailure(int num) {
_numFailure = num;
}
@@ -131,25 +135,25 @@ public class Lease extends DataStructureImpl {
public boolean equals(Object object) {
if ((object == null) || !(object instanceof Lease)) return false;
Lease lse = (Lease) object;
return DataHelper.eq(getEndDate(), lse.getEndDate())
&& DataHelper.eq(getTunnelId(), lse.getTunnelId())
&& DataHelper.eq(getGateway(), lse.getGateway());
return DataHelper.eq(_end, lse.getEndDate())
&& DataHelper.eq(_tunnelId, lse.getTunnelId())
&& DataHelper.eq(_gateway, lse.getGateway());
}
@Override
public int hashCode() {
return DataHelper.hashCode(getEndDate()) + DataHelper.hashCode(getGateway())
+ DataHelper.hashCode(getTunnelId());
return DataHelper.hashCode(_end) + DataHelper.hashCode(_gateway)
+ DataHelper.hashCode(_tunnelId);
}
@Override
public String toString() {
StringBuilder buf = new StringBuilder(128);
buf.append("[Lease: ");
buf.append("\n\tEnd Date: ").append(getEndDate());
buf.append("\n\tGateway: ").append(getGateway());
buf.append("\n\tTunnelId: ").append(getTunnelId());
buf.append("\n\tEnd Date: ").append(_end);
buf.append("\n\tGateway: ").append(_gateway);
buf.append("\n\tTunnelId: ").append(_tunnelId);
buf.append("]");
return buf.toString();
}

View File

@@ -46,6 +46,13 @@ import net.i2p.util.RandomSource;
* writeBytes() will output the original encrypted
* leases and the original leaseset signature.
*
* Revocation (zero leases) isn't used anywhere. In addition:
* - A revoked leaseset has an EarliestLeaseDate of -1, so it will
* never be stored successfully.
* - Revocation of an encrypted leaseset will explode.
* - So having an included signature at all is pointless?
*
*
* @author jrandom
*/
public class LeaseSet extends DataStructureImpl {
@@ -54,7 +61,7 @@ public class LeaseSet extends DataStructureImpl {
private PublicKey _encryptionKey;
private SigningPublicKey _signingKey;
// Keep leases in the order received, or else signature verification will fail!
private List _leases;
private List<Lease> _leases;
private Signature _signature;
private volatile Hash _currentRoutingKey;
private volatile byte[] _routingKeyGenMod;
@@ -62,7 +69,7 @@ public class LeaseSet extends DataStructureImpl {
// Store these since isCurrent() and getEarliestLeaseDate() are called frequently
private long _firstExpiration;
private long _lastExpiration;
private List _decryptedLeases;
private List<Lease> _decryptedLeases;
private boolean _decrypted;
private boolean _checked;
@@ -75,7 +82,7 @@ public class LeaseSet extends DataStructureImpl {
setSigningKey(null);
setSignature(null);
setRoutingKey(null);
_leases = new ArrayList();
_leases = new ArrayList(MAX_LEASES);
_routingKeyGenMod = null;
_receivedAsPublished = false;
_firstExpiration = Long.MAX_VALUE;
@@ -100,6 +107,7 @@ public class LeaseSet extends DataStructureImpl {
_encryptionKey = encryptionKey;
}
/** @deprecated unused */
public SigningPublicKey getSigningKey() {
return _signingKey;
}
@@ -130,6 +138,10 @@ public class LeaseSet extends DataStructureImpl {
_lastExpiration = expire;
}
/**
* @return 0-6
* A LeaseSet with no leases is revoked.
*/
public int getLeaseCount() {
if (isEncrypted())
return _leases.size() - 1;
@@ -208,6 +220,7 @@ public class LeaseSet extends DataStructureImpl {
/**
* Verify that the signature matches the lease set's destination's signing public key.
* OR the included revocation key.
*
* @return true only if the signature matches
*/
@@ -216,17 +229,18 @@ public class LeaseSet extends DataStructureImpl {
if (getDestination() == null) return false;
byte data[] = getBytes();
if (data == null) return false;
boolean signedByDest = DSAEngine.getInstance().verifySignature(getSignature(), data,
getDestination().getSigningPublicKey());
boolean signedByDest = DSAEngine.getInstance().verifySignature(_signature, data,
_destination.getSigningPublicKey());
boolean signedByRevoker = false;
if (!signedByDest) {
signedByRevoker = DSAEngine.getInstance().verifySignature(getSignature(), data, _signingKey);
signedByRevoker = DSAEngine.getInstance().verifySignature(_signature, data, _signingKey);
}
return signedByDest || signedByRevoker;
}
/**
* Verify that the signature matches the lease set's destination's signing public key.
* OR the specified revocation key.
*
* @return true only if the signature matches
*/
@@ -235,11 +249,11 @@ public class LeaseSet extends DataStructureImpl {
if (getDestination() == null) return false;
byte data[] = getBytes();
if (data == null) return false;
boolean signedByDest = DSAEngine.getInstance().verifySignature(getSignature(), data,
getDestination().getSigningPublicKey());
boolean signedByDest = DSAEngine.getInstance().verifySignature(_signature, data,
_destination.getSigningPublicKey());
boolean signedByRevoker = false;
if (!signedByDest) {
signedByRevoker = DSAEngine.getInstance().verifySignature(getSignature(), data, signingKey);
signedByRevoker = DSAEngine.getInstance().verifySignature(_signature, data, signingKey);
}
return signedByDest || signedByRevoker;
}
@@ -339,9 +353,9 @@ public class LeaseSet extends DataStructureImpl {
LeaseSet ls = (LeaseSet) object;
return DataHelper.eq(getEncryptionKey(), ls.getEncryptionKey()) &&
//DataHelper.eq(getVersion(), ls.getVersion()) &&
DataHelper.eq(_leases, ls._leases) && DataHelper.eq(getSignature(), ls.getSignature())
&& DataHelper.eq(getSigningKey(), ls.getSigningKey())
&& DataHelper.eq(getDestination(), ls.getDestination());
DataHelper.eq(_leases, ls._leases) && DataHelper.eq(_signature, ls.getSignature())
&& DataHelper.eq(_signingKey, ls.getSigningKey())
&& DataHelper.eq(_destination, ls.getDestination());
}
@@ -357,11 +371,11 @@ public class LeaseSet extends DataStructureImpl {
public String toString() {
StringBuilder buf = new StringBuilder(128);
buf.append("[LeaseSet: ");
buf.append("\n\tDestination: ").append(getDestination());
buf.append("\n\tEncryptionKey: ").append(getEncryptionKey());
buf.append("\n\tSigningKey: ").append(getSigningKey());
buf.append("\n\tDestination: ").append(_destination);
buf.append("\n\tEncryptionKey: ").append(_encryptionKey);
buf.append("\n\tSigningKey: ").append(_signingKey);
//buf.append("\n\tVersion: ").append(getVersion());
buf.append("\n\tSignature: ").append(getSignature());
buf.append("\n\tSignature: ").append(_signature);
buf.append("\n\tLeases: #").append(getLeaseCount());
for (int i = 0; i < getLeaseCount(); i++)
buf.append("\n\t\tLease (").append(i).append("): ").append(getLease(i));

View File

@@ -96,13 +96,13 @@ public class Payload extends DataStructureImpl {
public boolean equals(Object object) {
if ((object == null) || !(object instanceof Payload)) return false;
Payload p = (Payload) object;
return DataHelper.eq(getUnencryptedData(), p.getUnencryptedData())
&& DataHelper.eq(getEncryptedData(), p.getEncryptedData());
return DataHelper.eq(_unencryptedData, p.getUnencryptedData())
&& DataHelper.eq(_encryptedData, p.getEncryptedData());
}
@Override
public int hashCode() {
return DataHelper.hashCode(getUnencryptedData());
return DataHelper.hashCode(_unencryptedData);
}
@Override
@@ -110,11 +110,11 @@ public class Payload extends DataStructureImpl {
if (true) return "[Payload]";
StringBuilder buf = new StringBuilder(128);
buf.append("[Payload: ");
if (getUnencryptedData() != null)
buf.append("\n\tData: ").append(DataHelper.toString(getUnencryptedData(), 16));
if (_unencryptedData != null)
buf.append("\n\tData: ").append(DataHelper.toString(_unencryptedData, 16));
else
buf.append("\n\tData: *encrypted* = [").append(DataHelper.toString(getEncryptedData(), 16)).append("]");
buf.append("\n\tData: *encrypted* = [").append(DataHelper.toString(_encryptedData, 16)).append("]");
buf.append("]");
return buf.toString();
}
}
}

View File

@@ -122,15 +122,15 @@ public class RouterAddress extends DataStructureImpl {
public boolean equals(Object object) {
if ((object == null) || !(object instanceof RouterAddress)) return false;
RouterAddress addr = (RouterAddress) object;
return DataHelper.eq(getCost(), addr.getCost()) && DataHelper.eq(getExpiration(), addr.getExpiration())
&& DataHelper.eq(getOptions(), addr.getOptions())
&& DataHelper.eq(getTransportStyle(), addr.getTransportStyle());
return DataHelper.eq(_cost, addr.getCost()) && DataHelper.eq(_expiration, addr.getExpiration())
&& DataHelper.eq(_options, addr.getOptions())
&& DataHelper.eq(_transportStyle, addr.getTransportStyle());
}
/** the style should be sufficient, for speed */
@Override
public int hashCode() {
return DataHelper.hashCode(getTransportStyle());
return DataHelper.hashCode(_transportStyle);
}
@Override

View File

@@ -96,9 +96,9 @@ public class RouterIdentity extends DataStructureImpl {
public boolean equals(Object object) {
if ((object == null) || !(object instanceof RouterIdentity)) return false;
RouterIdentity ident = (RouterIdentity) object;
return DataHelper.eq(getCertificate(), ident.getCertificate())
&& DataHelper.eq(getSigningPublicKey(), ident.getSigningPublicKey())
&& DataHelper.eq(getPublicKey(), ident.getPublicKey());
return DataHelper.eq(_certificate, ident.getCertificate())
&& DataHelper.eq(_signingKey, ident.getSigningPublicKey())
&& DataHelper.eq(_publicKey, ident.getPublicKey());
}
/** the public key has enough randomness in it to use it by itself for speed */

View File

@@ -19,6 +19,7 @@ import java.util.Iterator;
import java.util.List;
import java.util.Properties;
import java.util.Set;
import java.util.Vector;
import net.i2p.crypto.DSAEngine;
import net.i2p.crypto.SHA256Generator;
@@ -36,8 +37,8 @@ public class RouterInfo extends DataStructureImpl {
private final static Log _log = new Log(RouterInfo.class);
private RouterIdentity _identity;
private volatile long _published;
private final Set _addresses;
private final Set _peers;
private final Set<RouterAddress> _addresses;
private final Set<Hash> _peers;
private /* FIXME final FIXME */ Properties _options;
private volatile Signature _signature;
private volatile Hash _currentRoutingKey;
@@ -60,8 +61,8 @@ public class RouterInfo extends DataStructureImpl {
public RouterInfo() {
setIdentity(null);
setPublished(0);
_addresses = new HashSet();
_peers = new HashSet();
_addresses = new HashSet(2);
_peers = new HashSet(0);
_options = new OrderedProperties();
setSignature(null);
_validated = false;
@@ -131,7 +132,7 @@ public class RouterInfo extends DataStructureImpl {
* router can be contacted.
*
*/
public Set getAddresses() {
public Set<RouterAddress> getAddresses() {
synchronized (_addresses) {
return new HashSet(_addresses);
}
@@ -142,7 +143,7 @@ public class RouterInfo extends DataStructureImpl {
* can be contacted.
*
*/
public void setAddresses(Set addresses) {
public void setAddresses(Set<RouterAddress> addresses) {
synchronized (_addresses) {
_addresses.clear();
if (addresses != null) _addresses.addAll(addresses);
@@ -151,20 +152,22 @@ public class RouterInfo extends DataStructureImpl {
}
/**
* Retrieve a set of SHA-256 hashes of RouterIdentities from rotuers
* Retrieve a set of SHA-256 hashes of RouterIdentities from routers
* this router can be reached through.
*
* @deprecated Implemented here but unused elsewhere
*/
public Set getPeers() {
public Set<Hash> getPeers() {
return _peers;
}
/**
* Specify a set of SHA-256 hashes of RouterIdentities from rotuers
* Specify a set of SHA-256 hashes of RouterIdentities from routers
* this router can be reached through.
*
* @deprecated Implemented here but unused elsewhere
*/
public void setPeers(Set peers) {
public void setPeers(Set<Hash> peers) {
synchronized (_peers) {
_peers.clear();
if (peers != null) _peers.addAll(peers);
@@ -276,6 +279,7 @@ public class RouterInfo extends DataStructureImpl {
// answer: they're always empty... they're a placeholder for one particular
// method of trusted links, which isn't implemented in the router
// at the moment, and may not be later.
// fixme to reduce objects - if (_peers == null) write 0
DataHelper.writeLong(out, 1, _peers.size());
List peers = DataHelper.sortStructures(_peers);
for (Iterator iter = peers.iterator(); iter.hasNext();) {
@@ -400,7 +404,7 @@ public class RouterInfo extends DataStructureImpl {
RoutingKeyGenerator gen = RoutingKeyGenerator.getInstance();
if ((gen.getModData() == null) || (_routingKeyGenMod == null)
|| (!DataHelper.eq(gen.getModData(), _routingKeyGenMod))) {
setRoutingKey(gen.getRoutingKey(getIdentity().getHash()));
setRoutingKey(gen.getRoutingKey(_identity.getHash()));
_routingKeyGenMod = gen.getModData();
}
return _currentRoutingKey;
@@ -411,7 +415,7 @@ public class RouterInfo extends DataStructureImpl {
}
public boolean validateRoutingKey() {
Hash identKey = getIdentity().getHash();
Hash identKey = _identity.getHash();
Hash rk = RoutingKeyGenerator.getInstance().getRoutingKey(identKey);
if (rk.equals(getRoutingKey()))
return true;
@@ -429,7 +433,7 @@ public class RouterInfo extends DataStructureImpl {
*/
public boolean isCurrent(long maxAgeMs) {
long earliestExpire = Clock.getInstance().now() - maxAgeMs;
if (getPublished() < earliestExpire)
if (_published < earliestExpire)
return false;
return true;
@@ -450,6 +454,18 @@ public class RouterInfo extends DataStructureImpl {
}
return null;
}
public List<RouterAddress> getTargetAddresses(String transportStyle) {
List<RouterAddress> ret = new Vector<RouterAddress>();
synchronized(this._addresses) {
for(Object o : this._addresses) {
RouterAddress addr = (RouterAddress)o;
if(addr.getTransportStyle().equals(transportStyle))
ret.add(addr);
}
}
return ret;
}
/**
* Actually validate the signature
@@ -537,7 +553,7 @@ public class RouterInfo extends DataStructureImpl {
RouterInfo info = (RouterInfo) object;
return DataHelper.eq(_identity, info.getIdentity())
&& DataHelper.eq(_signature, info.getSignature())
&& DataHelper.eq(getPublished(), info.getPublished())
&& DataHelper.eq(_published, info.getPublished())
&& DataHelper.eq(_addresses, info.getAddresses())
&& DataHelper.eq(_options, info.getOptions())
&& DataHelper.eq(_peers, info.getPeers());
@@ -546,7 +562,7 @@ public class RouterInfo extends DataStructureImpl {
@Override
public int hashCode() {
if (!_hashCodeInitialized) {
_hashCode = DataHelper.hashCode(_identity) + (int) getPublished();
_hashCode = DataHelper.hashCode(_identity) + (int) _published;
_hashCodeInitialized = true;
}
return _hashCode;
@@ -557,9 +573,9 @@ public class RouterInfo extends DataStructureImpl {
if (_stringified != null) return _stringified;
StringBuilder buf = new StringBuilder(5*1024);
buf.append("[RouterInfo: ");
buf.append("\n\tIdentity: ").append(getIdentity());
buf.append("\n\tSignature: ").append(getSignature());
buf.append("\n\tPublished on: ").append(new Date(getPublished()));
buf.append("\n\tIdentity: ").append(_identity);
buf.append("\n\tSignature: ").append(_signature);
buf.append("\n\tPublished on: ").append(new Date(_published));
Set addresses = _addresses; // getAddresses()
buf.append("\n\tAddresses: #: ").append(addresses.size());
for (Iterator iter = addresses.iterator(); iter.hasNext();) {

View File

@@ -83,14 +83,14 @@ public class TunnelId extends DataStructureImpl {
public boolean equals(Object obj) {
if ( (obj == null) || !(obj instanceof TunnelId))
return false;
return getTunnelId() == ((TunnelId)obj).getTunnelId();
return _tunnelId == ((TunnelId)obj).getTunnelId();
}
@Override
public int hashCode() {
return (int)getTunnelId();
return (int)_tunnelId;
}
@Override
public String toString() { return String.valueOf(getTunnelId()); }
public String toString() { return String.valueOf(_tunnelId); }
}

View File

@@ -155,8 +155,13 @@ public class Timestamper implements Runnable {
try {
lastFailed = !queryTime(_servers.toArray(new String[_servers.size()]));
} catch (IllegalArgumentException iae) {
if ( (!lastFailed) && (_log.shouldLog(Log.ERROR)) )
_log.error("Unable to reach any of the NTP servers - network disconnected?");
if ( (!_initialized) && (_log.shouldLog(Log.ERROR)) ) {
List<String> all = new ArrayList();
if (_priorityServers != null)
all.addAll(_priorityServers);
all.addAll(_servers);
_log.error("Unable to reach any of the NTP servers " + all + " - network disconnected? Or set time.sntpServerList=myserver1.com,myserver2.com in advanced configuration.");
}
lastFailed = true;
}
}

View File

@@ -92,9 +92,10 @@ public class Clock implements Timestamper.UpdateListener {
else if (getLog().shouldLog(Log.INFO))
getLog().info("Updating clock offset to " + offsetMs + "ms from " + _offset + "ms");
if (!_statCreated)
if (!_statCreated) {
_context.statManager().createRateStat("clock.skew", "How far is the already adjusted clock being skewed?", "Clock", new long[] { 10*60*1000, 3*60*60*1000, 24*60*60*60 });
_statCreated = true;
}
_context.statManager().addRateData("clock.skew", delta, 0);
} else {
getLog().log(Log.INFO, "Initializing clock offset to " + offsetMs + "ms from " + _offset + "ms");

View File

@@ -126,15 +126,21 @@ class LogWriter implements Runnable {
private void writeRecord(String val) {
if (val == null) return;
if (_currentOut == null) rotateFile();
if (_currentOut == null) {
rotateFile();
if (_currentOut == null)
return; // hosed
}
try {
_currentOut.write(val);
// may be a little off if a lot of multi-byte chars, but unlikely
_numBytesInCurrentFile += val.length();
} catch (Throwable t) {
System.err.println("Error writing record, disk full?");
t.printStackTrace();
if (!_write)
return;
System.err.println("Error writing log, disk full? " + t);
//t.printStackTrace();
}
if (_numBytesInCurrentFile >= _manager.getFileSize()) {
rotateFile();
@@ -160,7 +166,7 @@ class LogWriter implements Runnable {
}
}
if (!parent.isDirectory()) {
System.err.println("wtf, we cannot put the logs in a subdirectory of a plain file! we want to stre the log as " + f.getAbsolutePath());
System.err.println("Cannot put the logs in a subdirectory of a plain file: " + f.getAbsolutePath());
//System.exit(0);
}
}
@@ -168,8 +174,7 @@ class LogWriter implements Runnable {
try {
_currentOut = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(f), "UTF-8"));
} catch (IOException ioe) {
System.err.println("Error rotating into [" + f.getAbsolutePath() + "]");
ioe.printStackTrace();
System.err.println("Error rotating into [" + f.getAbsolutePath() + "]" + ioe);
}
}

View File

@@ -10,19 +10,28 @@ import java.util.concurrent.ConcurrentHashMap;
*/
public class ObjectCounter<K> {
private ConcurrentHashMap<K, Integer> _map;
private static final Integer ONE = Integer.valueOf(1);
public ObjectCounter() {
_map = new ConcurrentHashMap();
}
/**
* Add one.
* Not perfectly concurrent, new AtomicInteger(1) would be better,
* at the cost of some object churn.
* @return count after increment
*/
public void increment(K h) {
Integer i = _map.putIfAbsent(h, Integer.valueOf(1));
if (i != null)
_map.put(h, Integer.valueOf(i.intValue() + 1));
public int increment(K h) {
Integer i = _map.putIfAbsent(h, ONE);
if (i != null) {
int rv = i.intValue() + 1;
_map.put(h, Integer.valueOf(rv));
return rv;
}
return 1;
}
/**
* @return current count
*/
@@ -32,11 +41,20 @@ public class ObjectCounter<K> {
return i.intValue();
return 0;
}
/**
* @return set of objects with counts > 0
*/
public Set<K> objects() {
return _map.keySet();
}
/**
* start over
* @since 0.7.11
*/
public void clear() {
_map.clear();
}
}

View File

@@ -36,6 +36,9 @@ public abstract class Translate {
return key;
else if (lang.equals(TEST_LANG))
return TEST_STRING;
// shouldnt happen but dont dump the po headers if it does
if (key.equals(""))
return key;
ResourceBundle bundle = findBundle(bun, lang);
if (bundle == null)
return key;

22
debian/README.txt vendored Normal file
View File

@@ -0,0 +1,22 @@
This sets up a binary package with the following:
- A new user i2psvc (a lot of people already have an i2p user)
- i2psvc home is /var/lib/i2p
- $I2P is /usr/lib/i2p, owned by i2psvc
- i2psvc router directory is /var/lib/i2p/i2p-config (hack in WorkingDir.java)
- i2p daemon script in /etc/init.d/i2p
- i2prouter and eepget scripts in /usr/bin for other users to run it
- Users other than i2psvc cannot update via i2p, as they don't have
write permissions in $I2P
- Configured temp directory is /tmp
- linux and linux64 (i386) wrapper libs only
Todo:
- Remove lib/jbigi.jar, just build and include dynamic libjbigi
and the linux libjcpuid (and add dependency on libgmp)
- Initial router.config for i2psvc (without confusing i2p that
the router directory already exists):
* Disable browser launch at startup
* Move i2psnark dir, eepsite dir, log dir, etc. up one level

5
debian/changelog vendored
View File

@@ -1,3 +1,8 @@
i2p (0.7.10-0) testing; urgency=low
* tweaks
um...
-- zzz <nobody@nowhere.invalid> Wed, 31 Jan 2010 17:14:57 +0000
i2p (0.7-0) testing; urgency=low
* just setting this debian thing up
um...

14
debian/control vendored
View File

@@ -1,24 +1,18 @@
Source: i2p
Maintainer: jrandom
Maintainer: i2p
Section: net
Priority: optional
Homepage: http://dev.i2p2.de
Build-Depends: java-sdk, ant
Recommends: libgmp3c2
Version: 0.7-0
Tags: implemented-in::java, interface::daemon, network::client, network::server, role::program, security::cryptography
Homepage: http://www.i2p2.de/
Build-Depends: java-sdk, ant, gettext
Package: i2p
Architecture: all
Section: net
Priority: optional
Depends: java-runtime
Recommends: libgmp3c2
Description: load-balanced unspoofable packet switching network
I2P is an anonymizing network, offering a simple layer that identity-sensitive
applications can use to securely communicate. All data is wrapped with several
layers of encryption, and the network is both distributed and dynamic, with no
trusted parties.
Homepage: http://www.i2p2.de
Version: 0.7-0
Tags: implemented-in::java, interface::daemon, network::client, network::server, role::program, security::cryptography
Homepage: http://www.i2p2.de/

38
debian/rules vendored
View File

@@ -1,20 +1,36 @@
#!/usr/bin/make -f
build:
ant preppkg && \
(cd pkg-temp; chmod +x postinstall.sh) && \
mkdir -p debian/tmp/var/lib && \
mkdir -p debian/tmp/etc/init.d && \
cp -a debian/scripts/init debian/tmp/etc/init.d/i2p && \
cp -a pkg-temp debian/tmp/var/lib/i2p && \
ant preppkg-linux-only
mkdir -p debian/tmp/usr/lib
mkdir -p debian/tmp/etc/init.d
cp -a debian/scripts/init debian/tmp/etc/init.d/i2p
cp -a pkg-temp debian/tmp/usr/lib/i2p
chmod +x debian/tmp/usr/lib/i2p/postinstall.sh
sed 's|$$INSTALL_PATH|/usr/lib/i2p|g' debian/tmp/usr/lib/i2p/wrapper.config > debian/tmp/usr/lib/i2p/a
sed 's|$$SYSTEM_java_io_tmpdir|/tmp|g' debian/tmp/usr/lib/i2p/a > debian/tmp/usr/lib/i2p/wrapper.config
mkdir -p debian/tmp/usr/bin
sed 's|%INSTALL_PATH|/usr/lib/i2p|g' debian/tmp/usr/lib/i2p/eepget > debian/tmp/usr/lib/i2p/a
mv debian/tmp/usr/lib/i2p/a debian/tmp/usr/lib/i2p/eepget
cp debian/tmp/usr/lib/i2p/eepget debian/tmp/usr/bin/eepget
chmod +x debian/tmp/usr/bin/eepget
sed 's|%INSTALL_PATH|/usr/lib/i2p|g' debian/tmp/usr/lib/i2p/runplain.sh > debian/tmp/usr/lib/i2p/a
sed 's|%SYSTEM_java_io_tmpdir|/tmp|g' debian/tmp/usr/lib/i2p/a > debian/tmp/usr/lib/i2p/runplain.sh
sed 's|%INSTALL_PATH|/usr/lib/i2p|g' debian/tmp/usr/lib/i2p/i2prouter > debian/tmp/usr/lib/i2p/a
sed 's|%SYSTEM_java_io_tmpdir|/tmp|g' debian/tmp/usr/lib/i2p/a > debian/tmp/usr/lib/i2p/i2prouter
cp debian/tmp/usr/lib/i2p/i2prouter debian/tmp/usr/bin/i2prouter
chmod +x debian/tmp/usr/bin/i2prouter
rm debian/tmp/usr/lib/i2p/a
touch debian/build
binary: build
mkdir -p debian/tmp/DEBIAN && \
dpkg-gencontrol && \
cp -a debian/scripts/postinst debian/scripts/postrm debian/scripts/prerm debian/tmp/DEBIAN && \
mkdir -p debian/tmp/DEBIAN
dpkg-gencontrol
cp -a debian/scripts/postinst debian/scripts/postrm debian/scripts/prerm debian/tmp/DEBIAN
dpkg-deb -b debian/tmp ..
clean:
rm -f debian/build
ant clean
rm -Rf pkg-temp
rm -rf debian/tmp/
ant distclean
@exit 0

6
debian/scripts/init vendored
View File

@@ -1,4 +1,4 @@
#! /bin/sh
#!/bin/sh
### BEGIN INIT INFO
# Provides: i2p
@@ -13,8 +13,8 @@ set -e
. /lib/lsb/init-functions
function I2P {
su i2p -c "/var/lib/i2p/i2prouter $1"
I2P () {
su i2psvc -c "/usr/lib/i2p/i2prouter $1"
}
case "$1" in

View File

@@ -1,9 +1,14 @@
#!/bin/sh
TOP=/var/lib/i2p
useradd -b $TOP -r i2p 2>/dev/null
chown i2p $TOP -R
SVCHOME=/var/lib/i2p
I2P=/usr/lib/i2p
I2PUSER=i2psvc
update-rc.d
useradd -d $SVCHOME -r $I2PUSER
chown $I2PUSER:$I2PUSER $I2P -R
mkdir -p $SVCHOME
chown $I2PUSER:$I2PUSER $SVCHOME
cd $TOP
exec su i2p -c ./postinstall.sh
update-rc.d i2p defaults
cd $I2P
exec su $I2PUSER ./postinstall.sh

View File

@@ -1,2 +1,9 @@
#!/bin/sh
exec userdel i2p
I2PUSER=i2psvc
exec userdel $I2PUSER
# if somebody did updates in-network, there may be new files that dpkg
# doesn't know about, so just to be sure
I2P=/usr/lib/i2p
rm -rf $I2P

21
debian/scripts/prerm vendored
View File

@@ -1,2 +1,21 @@
#!/bin/sh
exec /etc/init.d/i2p stop
/etc/init.d/i2p stop
# stuff in /tmp
rm -f /tmp/wrapper.log /tmp/wrapper.log.1 /tmp/wrapper.log.2 /tmp/i2p.pid /tmp/routerjvm.pid /tmp/router.ping
# /etc/rc*.d/*i2p files
update-rc.d -f i2p remove
# dpkg doesn't know about these files, created by postinstall.sh
I2P=/usr/lib/i2p
rm -f $I2P/i2psvc $I2P/lib/libwrapper.so $I2P/lib/wrapper.jar
# copied out of jbigi.jar by the router
rm -f $I2P/libjbigi.so $I2P/libjcpuid.so
# the home directory for the i2p daemon
SVCHOME=/var/lib/i2p
rm -rf $SVCHOME
# if any user other than i2psvc has run i2p, the files in ~user/.i2p are not removed
exit 0

View File

@@ -1,3 +1,155 @@
2010-01-31 zzz
* i2psnark standalone: Fix CSS
* Jetty: Update to 5.1.15 to get ResourceHandler fix
2010-01-30 sponge
* Fix NPE in TCPtoI2P when a lookup fails, report the error to the stream.
* Fix setkeys bug in DoCMDS, forgot to create the object before calling
it's methods, which threw an NPE.
2010-01-29 zzz
* build.xml: Add a debian-source target
* Data structures:
- Speed up some hashcode() and equals()
- Cleanup and javadoc
* Jetty: Turn on checkAliases
* NetDb:
- Add basic DOS prevention for lookups
- Move flood throttle check so we don't throttle ourselves
- Don't store over client tunnels to pre-0.7.10 floodfills
- Don't update unused lease fail stats
* Startup: Disable browser launch for debian daemon
2010-01-28 welterde
* enhance support for multiple RouterAddresses' of the same style in RouterInfo
2010-01-26 zzz
* build.xml: Speed up distclean additions
* Clock: Don't refuse to update because of peer skew the first time
* Debian: Fixup, update, enhance scripts
* I2NP: Various cleanup and bulletproofing
* Log: Try to avoid complaints at shutdown
* Profiles: Fix lack of profiles at router startup, especially for new routers
* stats.jsp: Shrink the dropdown box
2010-01-24 zzz
* ProfileOrganizerRenderer: Cleanups
* Reseed: Update welt's reseed hostname
* Transport clock skews:
- Store and report UDP clock skews even for large values, so
a badly skewed local clock will be reported to the console
- Don't shitlist for NTCP clock skew if we don't know what time it is
- If NTP hasn't worked yet, have NTCP or SSU update the clock one time
- Include failed clock skew in NTCP skew vector if there aren't many connections
- Don't include NTCP clock skews for non-established connections
- Fix framed clock skew frame size
- Report framed clock skew even if for only one peer, if NTP hasn't worked yet
- Don't log RRD errors after clock adjustment
- Reduce min skew for console warning to 30s (was 45s)
- More Java 5 cleanups
2010-01-24 zzz
* Clock:
- Don't let a client update the router clock
- Restore and enhance vanished clock error log message
* Graphs: Enforce max size to lessen chance of OOM from malicious link
* NetDb:
- Move stat initialization, reduce number of rates
- Add basic DOS prevention by not flooding if stores are too-frequent
* ProfileOrganizer:
- Limit High Cap to 75 max
- Reduce max lock wait time, change no lock error to warning
- More cleanup
* Startup:
- Enable multiple parallel job runners much sooner to speed startup
- Rearrange the startup order to get the long jobs started sooner
- Don't allow the netDb readin job to clog the job queue
2010-01-21 dr|z3d
* New eepsite structure and enhanced pages. Now with graphics and stuff!
* 2010-01-22 0.7.10 released
2010-01-21 zzz
* eepget.bat: Add to pkg
* Floodfills: Increase max to 15 (was 9) and min to 10 (was 4)
* I2PTunnelServer: Fix bug preventing connection retries
at startup from working
* Logs: Don't be quite so noisy in the wrapper log if we
can't open the router log
* Properties: Don't play games with \r and \n on load/save,
it was causing fatal issues on DOS if your username started
with r or n
2010-01-19 sponge
* Firewall fix for NTCP, where firewalls will forget a NAT relationship
on a stream... AKA setting keepalive. This should fix the stuck NTCP
issue that has been bothing zzz for years.
* Set keepalive on BOB connections too, since this will assist closing
the connections in the event of a crash on a client.
2010-01-18 zzz
* configclients.jsp: Fix add-new-client feature
* Console: Add a tunnel share ratio estimate
* graphs.jsp:
- Remove jrobin sig
- Set lower limit to 0
- Save settings when changed
* Reseed: Support SSL and proxies
* Translate: Catch empty string
2010-01-17 zzz
* Clock: Change a CRIT to an ERROR, lower threshold for changing from 10s to 5s
* configclients.jsp: Support add, delete, edit
* I2CP: Clean up resources on 5-minute leaseset timeout at startup
* LeaseSet generation: Increment the lease date slightly, to force
the floodfill to flood it when it changes
* NetDb Lookups: Don't try to send a RI lookup to itself through a zero-hop tunnel
* NetDb Stores and Verifies:
- Do LS stores and verifies through client tunnels
to prevent correlation by the OBEP or FF
- Encrypt LS stores to prevent snooping by the OBEP,
if the floodfill supports it
- Encrypt LS and RI verifies to prevent snooping by the OBEP
- Extend verify delay and timeout
- Reenable RI verifies
- Disallow simultaneous verifies for the same key
- Don't resend on verify timeout; try a different peer instead
- Don't resend to same peer on verify fail, try a different one
- Adjust ff selection criteria
- Flood even if received garlic-encrypted
* Profiles: Limit fast peers to 30 max
* SSLEepGet: New
* Tunnels: Prevent more than one zero-hop tunnel in a lease
* VersionComparator: Move from TrustedUpdate.java to util
2010-01-14 sponge
* Fully clean up I2PTunnel. No more lint issues, should compile 100%
clean.
* Dropped unused class BufferLogger from I2PTunnel as it is not used
anylonger.
2010-01-14 sponge
* Clean up reverse connection ability, remove some annoyingly redundent
code. Place all settings in the console. It works!
2010-01-10 sponge
* Insert reverse connection ability into the http server code so that
seedless can start to get worked on. It's disabled by default.
* 2010-01-12 0.7.9 released
2010-01-12 zzz
* I2CP: Clean up resources on 5-minute leaseset timeout at startup
* Increase max floodfills to 9 (was 6)
* Temporarily disable routerInfo floodfill verifies
* Fix .fr eepsite index css
* Javdoc tweaks
2010-01-09 zzz
* Include new eepsite indexes in pkg
2010-01-06 zzz
* Summary bar tweaks

View File

@@ -4,7 +4,7 @@
<info>
<appname>i2p</appname>
<appversion>0.7.8</appversion>
<appversion>0.7.10</appversion>
<authors>
<author name="I2P" email="http://forum.i2p2.de/"/>
</authors>
@@ -138,6 +138,8 @@
<args><arg value="$INSTALL_PATH\uninstall_i2p_service_unix" /></args></executable>
<executable targetfile="$INSTALL_PATH/installer/delete.jar" type="jar" stage="postinstall" keep="true" failure="warn"> <os family="windows" />
<args><arg value="$INSTALL_PATH\lib\wrapper" /></args></executable>
<executable targetfile="$INSTALL_PATH/installer/delete.jar" type="jar" stage="postinstall" keep="true" failure="warn"> <os family="windows" />
<args><arg value="$INSTALL_PATH\eepget" /></args></executable>
<!-- workaround for vista permission problems - see comments above -->
<executable targetfile="$INSTALL_PATH/fixperms.bat" type="bin" stage="postinstall" keep="true" failure="warn"

View File

@@ -1,30 +0,0 @@
body { background-color:#000000; color: #ffffe0; margin-left: 8.7%; margin-right: 12.9%; margin-top: 6%; margin-bottom: 6%;}
body,h1,h2,h3,h4,p,ul,ol,li,dl,dt,dd,div,td,th,address,blockquote { font-family:"DejaVu Serif", serif; }
h1 { font-size:23pt; margin-bottom:20pt; }
h1.ph1 { font-size:20pt; margin-bottom:18pt; }
h2 { font-size:18pt; margin-bottom:18pt; }
h3 { font-size:16pt; }
h4 { font-size:14pt; }
h5 { font-size:13pt; }
p,ul,ol,li,dl,dt,dd,div,td,th,address,blockquote { font-size:12.2pt; }
a.footref { font-size: 70%; }
a:link { color:#ffc266; text-decoration:underline; }
a:visited { color:#ffd699; text-decoration:none; }
a:active { color:#ff9900; text-decoration:none; }
a.nonexistent { color: #ffffe0; text-decoration:underline; }
a.nonexistent:visited { color: #ffffe0; text-decoration:none; }
dl.contents { margin-top: 0; }
dt.contents { margin-bottom: 0; }
em { font-style: italic; }
li,dt { margin-top: 0.2em; }
p.footnote { font-size: 90%; }
p.verse { white-space: pre; margin-left: 8.7%; }
pre { font-family: monospace; white-space: pre; margin-left: 8.7%; }
strong { font-weight: bold; }
table { width:100%; }
td { border:0px solid #000; vertical-align:top; overflow:hidden; }
ul { list-style-type: disc }

View File

@@ -1,105 +1,122 @@
<html>
<head>
<title>Welcome to your eepsite</title>
<link rel="shortcut icon" href="favicon.ico" />
<link rel="stylesheet" type="text/css" href="eepsite.css" />
</head>
<body>
<h1>Welcome to your eepsite</h1>
<p>(<a href="index_de.html">Deutsch</a>)</p>
<p>This is your eepsite - simply edit the files under
~/.i2p/eepsite/docroot/ (Linux) or %APPDATA%\I2P\eepsite\docroot\ (Windows)
and they'll be reachable by others once you follow the instructions below.
In I2P, eepsites are addressed using a 'key', which is represented as a really long Base64 string.
(The 'key' is somewhat analogous to an IP address, and
is shown on the eepsite's I2PTunnel
<a href="http://127.0.0.1:7657/i2ptunnel/edit.jsp?tunnel=3">configuration page</a>).
The instructions below detail how to assign a name like "mysite.i2p" to your key and
start up your eepsite.</p>
<p>You can reach your eepsite locally through
<a href="http://127.0.0.1:7658/">http://127.0.0.1:7658/</a>.
</p>
<h2>Step-by-step instructions for starting your new eepsite and announcing it to the I2P community</h2>
Your eepsite is stopped by default.
After you start it, it will be difficult for other people to find because it
doesn't have a name and they don't have your really long Base64 key.
You could just tell people that really long key, but thankfully i2p has an address book
and several easy ways to tell people about your eepsite. Here's detailed instructions.
<ul>
<li>Pick a name for your eepsite (<i>something</i>.i2p). Use all lower-case.
You may wish to check first in your own router's address book
<a href="http://127.0.0.1:7657/susidns/addressbook.jsp?book=router&filter=none">here</a>,
or the file i2p/hosts.txt to see if your name is already taken.
Enter the new name for your eepsite on the
<a href="http://127.0.0.1:7657/i2ptunnel/edit.jsp?tunnel=3">eepsite i2ptunnel configuration page</a>
where it says "Website name". This will replace the default "mysite.i2p".
Also, check the "Auto Start" box. Your eepsite will now start every time you start your router.
Be sure and click "Save".
<li>Click the start button for your eepsite on the
<a href="http://127.0.0.1:7657/i2ptunnel/index.jsp">main i2ptunnel configuration page</a>.
You should now see "eepsite" listed under "Local Destinations" on the left side of the
<a href="http://127.0.0.1:7657/index.jsp">I2P Router Console</a>.
Your eepsite is now running.
<li>Highlight the entire "Local destination" key on the
<a href="http://127.0.0.1:7657/i2ptunnel/edit.jsp?tunnel=3">eepsite i2ptunnel configuration page</a>.
and copy it for
later pasting. Make sure you get the whole thing - it's over 500 characters and it must end in "AAAA".
<li>Enter the name and paste in the destination key into your
<a href="http://127.0.0.1:7657/susidns/addressbook.jsp?book=master">master address book</a>.
Click "Add" to add the destination to your address book.
<li>In your browser, enter in your eepsite name (<i>something</i>.i2p) and you should
be right back here. Hopefully it worked.
<li>Before you tell the world about your new eepsite, you should add some content.
Go to ~/.i2p/eepsite/docroot/ (Linux) or %APPDATA%\I2P\eepsite\docroot\ (Windows)
and copy this document (index.html) to help.html so you can refer to it later.
Now edit index.html and add content, pictures, and whatever you would like to share.
<li>Now it's time to add your eepsite to an I2P address book hosted by a site
such as <a href="http://stats.i2p/">stats.i2p</a>.
That is, you must enter
your eepsite name and key into a web interface on one or more of these sites.
Here is <a href="http://stats.i2p/i2p/addkey.html">the key entry form at stats.i2p</a>.
Again, your key is the entire "Local destination" key on the
<a href="http://127.0.0.1:7657/i2ptunnel/edit.jsp?tunnel=3">eepsite i2ptunnel configuration page</a>.
Be sure you get the whole thing, ending with "AAAA".
Don't forget to click "add a key".
Check to see if it reports the key was added.
Since many routers periodically get address book updates from these sites, within several hours others will be able to find your
website by simply typing <i>something</i>.i2p into their browser.
<li>Speaking of address book updates, this would be a good time to add some more addressbooks
to your own subscription list. Go to your <a href="http://127.0.0.1:7657/susidns/subscriptions.jsp">subscriptions configuration page</a>
and add a couple of these -
<a href="http://tino.i2p/hosts.txt">http://tino.i2p/hosts.txt</a>,
<a href="http://stats.i2p/cgi-bin/newhosts.txt">http://stats.i2p/cgi-bin/newhosts.txt</a>,
<a href="http://i2host.i2p/cgi-bin/i2hostetag">http://i2host.i2p/cgi-bin/i2hostetag</a>,
and hit "Save".
Now you will get updates too!
<li>If you are in a hurry and can't wait a few hours, you can tell people to use a "jump" address helper redirection service.
This will work within a few minutes of your entering the key to an address book on the same site.
Test it yourself first by entering
http://stats.i2p/cgi-bin/jump.cgi?a=<i>something</i>.i2p or
or http://i2host.i2p/cgi-bin/i2hostjump?<i>something</i>.i2p
into your browser.
Once it's working, then you can tell others to use it.
<li>Some people check eepsite lists such as
<a href="http://inproxy.tino.i2p/status.php">inproxy.tino.i2p/status.php</a> for new eepsites, so you may start getting
a few visitors. But there are plenty of other ways to tell people. Here are a few ideas:
<ul>
<li>Post a message on the <a href="http://forum.i2p/viewforum.php?f=16">Eepsite announce forum</a>
on <a href="http://forum.i2p/">forum.i2p</a>.
<li>Tell people about it on the #i2p or #i2p-chat channels on IRC.
<li>Put it in a new post on <a href="http://syndie.i2p2.de/">the new Syndie</a>.
<li>Put it in <a href="http://ugha.i2p/EepsiteIndex">Ugha's Eepsite Index Wiki</a>
</ul>
Note that some sites recommend pasting in that really long destination key.
You can if you want - but
if you have successfully posted your key at an add-key service,
tested it using a jump service, and waited 24 hours for the
address book update to propagate to others, that shouldn't be necessary.
<li>If you have any questions try IRC #i2p or the
<a href="http://forum.i2p/viewforum.php?f=10">technical problems section</a> on
<a href="http://forum.i2p/">forum.i2p</a>.
Good luck and welcome to I2P!
</ul>
</body>
</html>
<html>
<head>
<title>I2P Anonymous Webserver | Welcome to your eepsite</title>
<link rel="shortcut icon" href="favicon.ico" />
<link rel="stylesheet" type="text/css" href="lib/eepsite.css" />
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
<div class="fairylights">
<div class="main">
<h1>I2P Anonymous Webserver</h1>
<div class="langbar">
<!-- Most of these languages listed here are yet to be translated -->
<a href="index.html"><img src="lib/us.png" title="English" alt="English"></a>
<a href="index_na.html"><img src="lib/cn.png" title="中文" alt="中文"></a>
<a href="index_de.html"><img src="lib/de.png" title="Deutsch" alt="Deutsch"></a>
<a href="index_fr.html"><img src="lib/fr.png" title="Français" alt="Français"></a>
<a href="index_na.html"><img src="lib/nl.png" title="Nederlands" alt="Nederlands"></a>
<a href="index_ru.html"><img src="lib/ru.png" title="Русский" alt="Русский"></a>
<a href="index_na.html"><img src="lib/se.png" title="Svenska" alt="Svenska"></a>
</div>
<h2>Quick Guide to Anonymous Webserving on I2P</h2>
<p>This is your eepsite, your own anonymous I2P webserver - simply edit the files under ~/.i2p/eepsite/docroot/ (Linux) or %APPDATA%\I2P\eepsite\docroot\ (Windows)
and they'll be reachable by others once you follow the instructions below.
In I2P, eepsites are addressed using a 'key', which is represented as a really long Base64 string.
(The 'key' is somewhat analogous to an IP address, and
is shown on the eepsite's I2PTunnel
<a href="http://127.0.0.1:7657/i2ptunnel/edit.jsp?tunnel=3">configuration page</a>).
The instructions below detail how to assign a name like "mysite.i2p" to your key and start up your eepsite.</p>
<p>You can reach your eepsite locally via
<a href="http://127.0.0.1:7658/">http://127.0.0.1:7658/</a>.
</p>
<h2>How to set up and announce your eepsite</h2>
Your eepsite is stopped by default.
After you start it, it will be difficult for other people to find because it
doesn't have a name and they don't have your really long Base64 key.
You could just tell people that really long key, but thankfully i2p has an address book
and several easy ways to tell people about your eepsite. Here's detailed instructions.
<ul>
<li>Pick a name for your eepsite (<i>something</i>.i2p). Use all lower-case.
You may wish to check first in your own router's address book
<a href="http://127.0.0.1:7657/susidns/addressbook.jsp?book=router&filter=none">here</a>,
or the file i2p/hosts.txt to see if your name is already taken.
Enter the new name for your eepsite on the
<a href="http://127.0.0.1:7657/i2ptunnel/edit.jsp?tunnel=3">eepsite i2ptunnel configuration page</a>
where it says "Website name". This will replace the default "mysite.i2p".
Also, check the "Auto Start" box. Your eepsite will now start every time you start your router.
Be sure to click "Save".
<li>Click the start button for your eepsite on the
<a href="http://127.0.0.1:7657/i2ptunnel/index.jsp">main i2ptunnel configuration page</a>.
You should now see "eepsite" listed under "Local Destinations" on the left side of the
<a href="http://127.0.0.1:7657/index.jsp">I2P Router Console</a>.
Your eepsite is now running.
<li>Highlight the entire "Local destination" key on the
<a href="http://127.0.0.1:7657/i2ptunnel/edit.jsp?tunnel=3">eepsite i2ptunnel configuration page</a>.
and copy it for
later pasting. Make sure you get the whole thing - it's over 500 characters and it must end in "AAAA".
<li>Enter the name and paste in the destination key into your
<a href="http://127.0.0.1:7657/susidns/addressbook.jsp?book=master">master address book</a>.
Click "Add" to add the destination to your address book.
<li>In your browser, enter in your eepsite name (<i>something</i>.i2p) and you should
be right back here. Hopefully it worked.
<li>Before you tell the world about your new eepsite, you should add some content.
Go to ~/.i2p/eepsite/docroot/ (Linux) or %APPDATA%\I2P\eepsite\docroot\ (Windows) and replace the index.html redirect page with your own content. Virtual folders work, so you can host files from a sub directory without explicitly needing to provide a page with links to files. If you need a template for a basic site, feel free to borrow and adapt <a href="pagetemplate.html">this page</a> and <a href="lib/">content</a>!
</ul>
<h2>Register your own .I2P Domain</h2><ul>
<li>Now it's time to add your eepsite to an I2P address book hosted by a site
such as <a href="http://stats.i2p/">stats.i2p</a>.
That is, you must enter
your eepsite name and key into a web interface on one or more of these sites.
Here is <a href="http://stats.i2p/i2p/addkey.html">the key entry form at stats.i2p</a>.
Again, your key is the entire "Local destination" key on the
<a href="http://127.0.0.1:7657/i2ptunnel/edit.jsp?tunnel=3">eepsite i2ptunnel configuration page</a>.
Be sure you get the whole thing, ending with "AAAA".
Don't forget to click "add a key".
Check to see if it reports the key was added.
Since many routers periodically get address book updates from these sites, within several hours others will be able to find your website by simply typing <i>something</i>.i2p into their browser.
</ul><h2>Adding Addressbook Subscriptions</h2><ul>
<li>Speaking of address book updates, this would be a good time to add some more addressbooks
to your own <a href="http://127.0.0.1:7657/susidns/subscriptions.jsp">subscription list</a>. Go to your subscriptions configuration page and add a couple of these for an automatically updated list of new hosts:<ul>
<li><a href="http://tino.i2p/hosts.txt">http://tino.i2p/hosts.txt</a>
<li><a href="http://stats.i2p/cgi-bin/newhosts.txt">http://stats.i2p/cgi-bin/newhosts.txt</a>
<li><a href="http://i2host.i2p/cgi-bin/i2hostetag">http://i2host.i2p/cgi-bin/i2hostetag</a></ul>
<li>If you are in a hurry and can't wait a few hours, you can tell people to use a "jump" address helper redirection service.
This will work within a few minutes of your entering the key to an address book on the same site.
Test it yourself first by entering
http://stats.i2p/cgi-bin/jump.cgi?a=<i>something</i>.i2p or
or http://i2host.i2p/cgi-bin/i2hostjump?<i>something</i>.i2p
into your browser.
Once it's working, then you can tell others to use it.
<li>Some people check eepsite lists such as
<a href="http://inproxy.tino.i2p/status.php">inproxy.tino.i2p/status.php</a> for new eepsites, so you may start getting
a few visitors. But there are plenty of other ways to tell people. Here are a few ideas:
<ul>
<li>Post a message on the <a href="http://forum.i2p/viewforum.php?f=16">Eepsite announce forum</a>
on <a href="http://forum.i2p/">forum.i2p</a>.
<li>Tell people about it on the #i2p or #i2p-chat channels on IRC.
<li>Put it in a new post on <a href="http://syndie.i2p2.de/">the new Syndie</a>.
<li>Put it in <a href="http://ugha.i2p/EepsiteIndex">Ugha's Eepsite Index Wiki</a>
</ul>
Note that some sites recommend pasting in that really long destination key.
You can if you want - but
if you have successfully posted your key at an add-key service,
tested it using a jump service, and waited 24 hours for the
address book update to propagate to others, that shouldn't be necessary.</ul>
<h2>Further Assistance</h2><ul>
<li>If you have any questions, the following places are available for support:
<ul>
<li>Our IRC support channel: <ul><li><a href="irc://irc.freenode.net/i2p">#i2p on Freenode</a>
<li>Anonymously via your resident <a href="irc://127.0.0.1:6668/i2p">I2P IRC tunnel</a>.</ul>
<li><a href="http://forum.i2p/viewforum.php?f=10">The technical problems section</a> on
<a href="http://forum.i2p/">forum.i2p</a>.</ul>
</ul><div class="notify">
<b>Note:</b> This page, the website and the console all need translating into YOUR language if it's not already been done or in progress. Please consider helping the project grow by <a href="http://www.i2p2.i2p/getinvolved.html">volunteering your time</a> to translate. Contact the project via the IRC channel listed above. Thanks in advance!</div>
<hr><div class="footnote">
Document last edited: November 2009.</div>
</div></div>
</body>
</html>

View File

@@ -1,172 +1,184 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html><head>
<title>Willkommen zu Ihrer Eepsite!</title>
<meta name="generator" content="muse.el">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link rel="stylesheet" type="text/css" href="eepsite.css">
</head><body>
<h1>Willkommen zu Ihrer Eepsite!</h1>
<p>Diese ist Ihre <strong>Eepsite</strong>, Ihre Web-Präsens über I2P. Editieren Sie einfach die Dateien unter
<em>~/.i2p/eepsite/docroot/</em> (Linux) oder <em>%APPDATA%\I2P\eepsite\docroot\</em> (Windows)
und nachdem Sie den Anweisungen weiter unten gefolgt sind, werden Sie
vertreten durch Ihre Eepsite von anderen im I2P-Netz und, soweit
verfügbar, über private „Out-Proxys“ weltweit erreichbar sein.</p>
<p>In I2P werden Eepsites unter Verwendung eines Schlüssels (key) adressiert, dieser wird durch eine sehr lange Base64-Zeichenkette<sup><a class="footref" name="fnr.1" href="#fn.1">1</a></sup> dargestellt.
(Dieser Schlüssel ist analog zur Standard IP-Adresse zu verstehen; man kann ihn sich in der Konfiguration für Eepsites unter <a href="http://127.0.0.1:7657/i2ptunnel/index.jsp">I2PTunnel</a> anzeigen lassen.)</p>
<p>Folgende Anweisungen sollen zeigen, wie man einer Eepsite einen
Namen wie beispielsweise „meineseite.i2p“ zuweist und an dem Schlüssel
bindet.
Sie können Ihre Eepsite, nachdem sie gestartet wurde, lokal unter <a href="http://127.0.0.1:7658/">http://127.0.0.1:7658/</a> erreichen.</p>
<p>Es folgt eine schrittweise Anleitung für das Starten Ihrer neuen Eepsite und dessen Ankündigung in der I2P-Gemeinde.</p>
<p>In der Grundeinstellung ist Ihre Eepsite nicht eingeschaltet.
Auch nach dem sie gestartet wurde, ist es für andere Teilnehmer immer
noch schwierig Ihre Seite zu finden, solange bis Sie Ihren
Base64-Schlüssel und den Namen Ihrer Eepsite veröffentlicht haben.
Natürlich können Sie den Leuten diesen sehr langen Schlüssel auch so
mitteilen, aber glücklicherweise bringt I2P bereits ein Adressbuch mit
und hat verschiedene Wege um Ihre Eepsite bekannt zu machen.</p>
<h3>Eine detailierte Einführung</h3>
<h4>Meine Eepsite</h4>
<ol>
<li>Wählen Sie einen eigenen Namen für Ihre Eepsite nur in diesem
Beispiel heißt sie „meineseite.i2p“ benutzen Sie nur Kleinschrift.
Sie können in Ihrem <a href="http://127.0.0.1:7657/susidns/addressbook.jsp?book=router">Adressbuch</a> überprüfen, ob der gewünschte Name bereits vergeben ist (Anmerkung: die Daten aus den Adressbuch werden im Klartext in der <em>i2p/hosts.txt</em> gespeichert).
<br>
<br></li>
<li>Rufen Sie nun, möglichst in einem neuen Browser-Fenster, die Konfiguration für Eepsites <a href="http://127.0.0.1:7657/i2ptunnel/index.jsp">I2PTunnel</a> auf. Unter „Local Server Tunnels“ wählen Sie den Eintrag „<a href="http://127.0.0.1:7657/i2ptunnel/edit.jsp?tunnel=3">eepsite</a>“.
Sie befinden sich nun auf der Seite mit Überschrift „Edit server
settings“. In das Feld für „Website name:“ überschreiben Sie die
Vorgabe „mysite.i2p“ mit Ihrem Wunschnamen. Optional geben Sie im Feld
„Description:“ eine Beschreibung an.
<br>
<br></li>
<li>Wenn Sie möchten das Ihre Eepsite automatisch gestartet wird, kreuzen Sie das Feld „Auto Start:“ an.
<br>
<br></li>
<li>Durch drücken des Links „Add to local addressbook“ gleich rechts
neben Ihrem Schlüssel (Feld „Local destination“) wird Ihr Schlüssel in
Ihr <em>privates</em> Adressbuch geschrieben (<em>i2p/privatehosts.txt</em>).
<br>
<br></li>
<li>Jetzt sichern Sie Ihre Einstellungen indem Sie auf „Save“ klicken.
<br>
<br></li>
<li>Wir gehen wieder zurück auf die Konfigurationsseite <a href="http://127.0.0.1:7657/i2ptunnel/index.jsp">I2PTunnel</a>
und drücken den „Start“-Knopf für die „eepsite“. Nach dem erfolgreichen
Start wird Ihre Eepsite auf der linken Seite in der I2P <a href="http://127.0.0.1:7657/index.jsp">Router Console</a> unter „Local
Destinations“ angezeigt.</li>
</ol>
<h4>Das Veröffentlichen vorbereiten</h4>
<ol>
<li>Heben Sie in der „<a href="http://127.0.0.1:7657/i2ptunnel/edit.jsp?tunnel=3">Konfiguration</a>
den gesamten Schlüssel für Ihre Eepsite hervor und kopieren ihn in die
Zwischenablage. Stellen Sie sicher auch tatsächlich die gesamte, über
500 Zeichen lange Zeichenkette die auf „AAAA“ endet, „erwischt“ zu
haben.
<br>
<br></li>
<li>Öffnen Sie Ihr <a href="http://127.0.0.1:7657/susidns/addressbook.jsp?book=master">Master-Adressbuch</a>,
tragen Ihren zuvor gewählten Wunschnamen ihrer Eepsite unter „Hostname“
ein und kopieren den Schlüssel in das Feld „Destination“. Ein Klick auf
„Add“ und diese „Destination“ ist in Ihrem Adressbuch.<sup><a class="footref" name="fnr.2" href="#fn.2">2</a></sup>
<br>
<br></li>
<li>Ihre Eepsite sollte jetzt über den Browser erreichbar sein. Dazu
tragen Sie, wie gewohnt, den Namen Ihrer Eepsite (hier im Beispiel
„meineseite.i2p“) in die Adressleiste Ihres Browsers ein und rufen sie
auf. Wenn alles gutgegangen ist, sind Sie nun wieder hier nur die
Adresse hat sich geändert.
<br>
<br></li>
<li>Bevor Sie der Welt von Ihrer neuen Eepsite berichten sollte sie
auch über ein wenig Inhalt verfügen. Begeben Sie sich in das
Verzeichnis <em>„~/.i2p/eepsite/docroot/“</em> (Linux) oder <em>„%APPDATA%\I2P\eepsite\docroot\“</em> (Windows)
und benennen Sie dieses Dokument von <em>„index.html“</em> nach <em>„hilfe.html“</em> um, so können Sie später darauf zurück greifen. Erstellen Sie Ihre eigene <em>„index.html“</em> und füllen diese mit Inhalten, Bildern oder was auch immer Sie anderen hierüber mitteilen wollen.</li>
</ol>
<h4><a name="AnkerDEOeA" id="AnkerDEOeA"></a>Die Eepsite öffentlich ankündigen</h4>
<ul>
<li>Nun ist es an der Zeit, Ihre Eepsite in einem globalen I2P-Adressbuch, wie beispielsweise bei <a href="http://stats.i2p/i2p/addkey.html">stats.i2p</a>,
einzutragen. Das heißt, Sie müssen Namen und Schlüssel Ihrer Eepsite
und eine optionale Beschreibung in ein Formular auf einen oder mehreren
dieser Seiten eingeben. Wie schon oben gesagt, Ihr Schlüssel ist der <em>vollständige</em> Schlüssel wie er in der <a href="http://127.0.0.1:7657/i2ptunnel/index.jsp">I2PTunnel</a> Konfiguration für die „<a href="http://127.0.0.1:7657/i2ptunnel/edit.jsp?tunnel=3">Eepsite</a>
im Feld „Local destination“ angegeben ist (... über 500 Zeichen, endet
auf „AAAA“). Bestätigen Sie Ihre Angaben mit einem klick auf „Submit“.
Überprüfen Sie ob Ihr Schlüssel tatsächlich hinzugefügt wurde.
<br>
<br></li>
<li>Da viele Router regelmäßig Adressbuchupdates von diesen Seiten
erhalten, sollten andere innerhalb einiger Stunden in der Lage sein,
Ihre Eesite durch
den Eintrag des Namens im Browser aufzurufen.
<br>
<br></li>
<li>Weil wir gerade von Adressbuchupdates sprechen es ist eine gute Zeit um weitere Adressbücher dem bestehenden <a href="http://127.0.0.1:7657/susidns/subscriptions.jsp">Abonnement</a>
hinzuzufügen. Öffnen Sie Ihre Konfiguration und fügen Sie einige der
folgenden Dienste Ihrem Abonnement hinzu (nur die jeweilige URL) und
speichern Sie die Angaben.<sup><a class="footref" name="fnr.3" href="#fn.3">3</a></sup> Ab jetzt erhalten Sie ebenso alle Updates automatisch!
<blockquote>
<p class="quoted"><code>http://tino.i2p/hosts.txt</code> (<a href="http://tino.i2p/hosts.txt">tino.i2p</a>)<br>
<code>http://stats.i2p/cgi-bin/newhosts.txt</code> (<a href="http://stats.i2p/cgi-bin/newhosts.txt">stats.i2p</a>)<br>
<code>http://i2host.i2p/cgi-bin/i2hostetag</code> (<a href="=http://i2host.i2p/cgi-bin/i2hostetag">i2host.i2p</a>)
<br>
<br></p>
</blockquote></li>
<li>Haben Sie es eilig und können nicht 12 bis 24 Stunden warten, ist
es möglich das andere für Ihre Eepseite den „jump“
Adresshelfer-Umlenkungs-Dienst benutzen. Dieses funktioniert innerhalb
einiger Minuten nach Eingabe des Schlüssels zu einem Adressbuch auf der
gleichen Seite.<br><br>
Zuerst testen Sie das mittels Aufruf folgender Dienste. Sobald das
klappt, können anderen diese Möglichkeit nutzen. (Ersetzen Sie
„meineseite.i2p“ durch Ihre Seite.)
<ul>
<li><a href="http://stats.i2p/cgi-bin/jump.cgi?a=meineseite.i2p">http://stats.i2p/cgi-bin/jump.cgi?a=meineseite.i2p</a> oder</li>
<li><a href="http://i2host.i2p/cgi-bin/i2hostjump?meineseite.i2p">http://i2host.i2p/cgi-bin/i2hostjump?meineseite.i2p</a>
<br>
<br></li>
</ul></li>
<li>Manche Leute erkundigen sich auf Eepsites-Listen wie <a href="http://inproxy.tino.i2p/status.php">inproxy.tino.i2p/status.php</a> über neue Eepsites, so könnten Sie an einige Besucher kommen. Aber es gibt weitere Wege sich anzukündigen:
<ul>
<li>Veröffentlichen Sie eine Nachricht im <a href="http://forum.i2p">I2P Forum</a> unter <a href="http://forum.i2p/viewforum.php?f=16">Eepsite Announce</a></li>
<li>Besuchen sie die IRC-Kanäle #i2p oder #i2p-chat (beide englischsprachig) und Werben Sie sanft für sich.</li>
<li>Verbreiten Sie eine Nachricht über Syndie.</li>
<li>Tragen Sie sich ein in Ughas <a href="http://ugha.i2p/EepsiteIndex">Eepsite Index</a> Wiki.
<br>
<br></li>
</ul></li>
<li>Bitte beachten Sie, einige Seiten empfehlen das Einfügen des langen
„Destination“-Schlüssels; das können Sie wenn Sie möchten aber wenn
Sie Ihren Schlüssel erfolgreich beim „Schlüssel-Dienst“ eingetragen und
ihn mittels „jump“-Dienst getestet haben, sollte nach 24 Stunden
Wartezeit dieses Vorgehen nicht nötig sein.
<br>
<br></li>
<li>Sollten Sie Fragen haben, benutzen Sie den IRC-Kanal #i2p oder die technische Abteilung im <a href="http://forum.i2p">I2P Forum</a></li>
</ul>
<p>______________
</p><p class="footnote"><a class="footnum" name="fn.1" href="#fnr.1">1.</a> <strong>Base64</strong>
beschreibt ein Verfahren zur Kodierung von 8-Bit-Binärdaten in eine
Zeichenfolge, die nur aus wenigen, Codepage-unabhängigen ASCII-Zeichen
besteht.
</p><p class="footnote"><a class="footnum" name="fn.2" href="#fnr.2">2.</a> Anmerkung: Wenn dieses Vorgehen mit der Fehlermeldung „Invalid nonce. Are you being spoofed?“ quittiert wird, müssen <em>Cookies</em> im Browser erlaubt werden. Ist dies nicht möglich, können Sie mit einem Editor die Datei <em>„i2p/userhosts.txt“</em> bearbeiten und so die Adressen einfügen. <a href="http://sperrbezirk.i2p/Konqueror_Susi.html">Konqueror</a> ist etwas eigenwillig.
</p><p class="footnote"><a class="footnum" name="fn.3" href="#fnr.3">3.</a> Gleiches wie unter <sup><a class="footref" name="fnr.2" href="#fn.2">2</a></sup> gilt für <em>„i2p/addressbook/subscriptions.txt“</em>.</p>
</body></html>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html><head>
<title>Willkommen zu Ihrer Eepsite!</title>
<meta name="generator" content="muse.el">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link rel="stylesheet" type="text/css" href="lib/eepsite.css">
</head><body>
<div class="fairylights">
<div class="main">
<h1>Willkommen zu Ihrer Eepsite!</h1>
<div class="langbar">
<!-- Most of these languages listed here are yet to be translated -->
<a href="index.html"><img src="lib/us.png" title="English" alt="English"></a>
<a href="index_na.html"><img src="lib/cn.png" title="中文" alt="中文"></a>
<a href="index_de.html"><img src="lib/de.png" title="Deutsch" alt="Deutsch"></a>
<a href="index_fr.html"><img src="lib/fr.png" title="Français" alt="Français"></a>
<a href="index_na.html"><img src="lib/nl.png" title="Nederlands" alt="Nederlands"></a>
<a href="index_ru.html"><img src="lib/ru.png" title="Русский" alt="Русский"></a>
<a href="index_na.html"><img src="lib/se.png" title="Svenska" alt="Svenska"></a>
</div>
<p>Diese ist Ihre <strong>Eepsite</strong>, Ihre Web-Präsens über I2P. Editieren Sie einfach die Dateien unter
<em>~/.i2p/eepsite/docroot/</em> (Linux) oder <em>%APPDATA%\I2P\eepsite\docroot\</em> (Windows)
und nachdem Sie den Anweisungen weiter unten gefolgt sind, werden Sie
vertreten durch Ihre Eepsite von anderen im I2P-Netz und, soweit
verfügbar, über private „Out-Proxys“ weltweit erreichbar sein.</p>
<p>In I2P werden Eepsites unter Verwendung eines Schlüssels (key) adressiert, dieser wird durch eine sehr lange Base64-Zeichenkette<sup><a class="footref" name="fnr.1" href="#fn.1">1</a></sup> dargestellt.
(Dieser Schlüssel ist analog zur Standard IP-Adresse zu verstehen; man kann ihn sich in der Konfiguration für Eepsites unter <a href="http://127.0.0.1:7657/i2ptunnel/index.jsp">I2PTunnel</a> anzeigen lassen.)</p>
<p>Folgende Anweisungen sollen zeigen, wie man einer Eepsite einen
Namen wie beispielsweise „meineseite.i2p“ zuweist und an dem Schlüssel
bindet.
Sie können Ihre Eepsite, nachdem sie gestartet wurde, lokal unter <a href="http://127.0.0.1:7658/">http://127.0.0.1:7658/</a> erreichen.</p>
<p>Es folgt eine schrittweise Anleitung für das Starten Ihrer neuen Eepsite und dessen Ankündigung in der I2P-Gemeinde.</p>
<p>In der Grundeinstellung ist Ihre Eepsite nicht eingeschaltet.
Auch nach dem sie gestartet wurde, ist es für andere Teilnehmer immer
noch schwierig Ihre Seite zu finden, solange bis Sie Ihren
Base64-Schlüssel und den Namen Ihrer Eepsite veröffentlicht haben.
Natürlich können Sie den Leuten diesen sehr langen Schlüssel auch so
mitteilen, aber glücklicherweise bringt I2P bereits ein Adressbuch mit
und hat verschiedene Wege um Ihre Eepsite bekannt zu machen.</p>
<h3>Eine detailierte Einführung</h3>
<h4>Meine Eepsite</h4>
<ol>
<li>Wählen Sie einen eigenen Namen für Ihre Eepsite nur in diesem
Beispiel heißt sie „meineseite.i2p“ benutzen Sie nur Kleinschrift.
Sie können in Ihrem <a href="http://127.0.0.1:7657/susidns/addressbook.jsp?book=router">Adressbuch</a> überprüfen, ob der gewünschte Name bereits vergeben ist (Anmerkung: die Daten aus den Adressbuch werden im Klartext in der <em>i2p/hosts.txt</em> gespeichert).
<br>
<br></li>
<li>Rufen Sie nun, möglichst in einem neuen Browser-Fenster, die Konfiguration für Eepsites <a href="http://127.0.0.1:7657/i2ptunnel/index.jsp">I2PTunnel</a> auf. Unter „Local Server Tunnels“ wählen Sie den Eintrag „<a href="http://127.0.0.1:7657/i2ptunnel/edit.jsp?tunnel=3">eepsite</a>.
Sie befinden sich nun auf der Seite mit Überschrift „Edit server
settings“. In das Feld für „Website name:“ überschreiben Sie die
Vorgabe „mysite.i2p“ mit Ihrem Wunschnamen. Optional geben Sie im Feld
„Description:“ eine Beschreibung an.
<br>
<br></li>
<li>Wenn Sie möchten das Ihre Eepsite automatisch gestartet wird, kreuzen Sie das Feld „Auto Start:“ an.
<br>
<br></li>
<li>Durch drücken des Links „Add to local addressbook“ gleich rechts
neben Ihrem Schlüssel (Feld „Local destination“) wird Ihr Schlüssel in
Ihr <em>privates</em> Adressbuch geschrieben (<em>i2p/privatehosts.txt</em>).
<br>
<br></li>
<li>Jetzt sichern Sie Ihre Einstellungen indem Sie auf „Save“ klicken.
<br>
<br></li>
<li>Wir gehen wieder zurück auf die Konfigurationsseite <a href="http://127.0.0.1:7657/i2ptunnel/index.jsp">I2PTunnel</a>
und drücken den „Start“-Knopf für die „eepsite“. Nach dem erfolgreichen
Start wird Ihre Eepsite auf der linken Seite in der I2P <a href="http://127.0.0.1:7657/index.jsp">Router Console</a> unter „Local
Destinations“ angezeigt.</li>
</ol>
<h4>Das Veröffentlichen vorbereiten</h4>
<ol>
<li>Heben Sie in der „<a href="http://127.0.0.1:7657/i2ptunnel/edit.jsp?tunnel=3">Konfiguration</a>
den gesamten Schlüssel für Ihre Eepsite hervor und kopieren ihn in die
Zwischenablage. Stellen Sie sicher auch tatsächlich die gesamte, über
500 Zeichen lange Zeichenkette die auf „AAAA“ endet, „erwischt“ zu
haben.
<br>
<br></li>
<li>Öffnen Sie Ihr <a href="http://127.0.0.1:7657/susidns/addressbook.jsp?book=master">Master-Adressbuch</a>,
tragen Ihren zuvor gewählten Wunschnamen ihrer Eepsite unter „Hostname“
ein und kopieren den Schlüssel in das Feld „Destination“. Ein Klick auf
„Add“ und diese „Destination“ ist in Ihrem Adressbuch.<sup><a class="footref" name="fnr.2" href="#fn.2">2</a></sup>
<br>
<br></li>
<li>Ihre Eepsite sollte jetzt über den Browser erreichbar sein. Dazu
tragen Sie, wie gewohnt, den Namen Ihrer Eepsite (hier im Beispiel
„meineseite.i2p“) in die Adressleiste Ihres Browsers ein und rufen sie
auf. Wenn alles gutgegangen ist, sind Sie nun wieder hier nur die
Adresse hat sich geändert.
<br>
<br></li>
<li>Bevor Sie der Welt von Ihrer neuen Eepsite berichten sollte sie
auch über ein wenig Inhalt verfügen. Begeben Sie sich in das
Verzeichnis <em>„~/.i2p/eepsite/docroot/“</em> (Linux) oder <em>„%APPDATA%\I2P\eepsite\docroot\“</em> (Windows)
und benennen Sie dieses Dokument von <em>„index.html“</em> nach <em>„hilfe.html“</em> um, so können Sie später darauf zurück greifen. Erstellen Sie Ihre eigene <em>„index.html“</em> und füllen diese mit Inhalten, Bildern oder was auch immer Sie anderen hierüber mitteilen wollen.</li>
</ol>
<h4><a name="AnkerDEOeA" id="AnkerDEOeA"></a>Die Eepsite öffentlich ankündigen</h4>
<ul>
<li>Nun ist es an der Zeit, Ihre Eepsite in einem globalen I2P-Adressbuch, wie beispielsweise bei <a href="http://stats.i2p/i2p/addkey.html">stats.i2p</a>,
einzutragen. Das heißt, Sie müssen Namen und Schlüssel Ihrer Eepsite
und eine optionale Beschreibung in ein Formular auf einen oder mehreren
dieser Seiten eingeben. Wie schon oben gesagt, Ihr Schlüssel ist der <em>vollständige</em> Schlüssel wie er in der <a href="http://127.0.0.1:7657/i2ptunnel/index.jsp">I2PTunnel</a> Konfiguration für die „<a href="http://127.0.0.1:7657/i2ptunnel/edit.jsp?tunnel=3">Eepsite</a>
im Feld „Local destination“ angegeben ist (... über 500 Zeichen, endet
auf „AAAA“). Bestätigen Sie Ihre Angaben mit einem klick auf „Submit“.
Überprüfen Sie ob Ihr Schlüssel tatsächlich hinzugefügt wurde.
<br>
<br></li>
<li>Da viele Router regelmäßig Adressbuchupdates von diesen Seiten
erhalten, sollten andere innerhalb einiger Stunden in der Lage sein,
Ihre Eesite durch
den Eintrag des Namens im Browser aufzurufen.
<br>
<br></li>
<li>Weil wir gerade von Adressbuchupdates sprechen es ist eine gute Zeit um weitere Adressbücher dem bestehenden <a href="http://127.0.0.1:7657/susidns/subscriptions.jsp">Abonnement</a>
hinzuzufügen. Öffnen Sie Ihre Konfiguration und fügen Sie einige der
folgenden Dienste Ihrem Abonnement hinzu (nur die jeweilige URL) und
speichern Sie die Angaben.<sup><a class="footref" name="fnr.3" href="#fn.3">3</a></sup> Ab jetzt erhalten Sie ebenso alle Updates automatisch!
<blockquote>
<p class="quoted"><code>http://tino.i2p/hosts.txt</code> (<a href="http://tino.i2p/hosts.txt">tino.i2p</a>)<br>
<code>http://stats.i2p/cgi-bin/newhosts.txt</code> (<a href="http://stats.i2p/cgi-bin/newhosts.txt">stats.i2p</a>)<br>
<code>http://i2host.i2p/cgi-bin/i2hostetag</code> (<a href="http://i2host.i2p/cgi-bin/i2hostetag">i2host.i2p</a>)
<br>
<br></p>
</blockquote></li>
<li>Haben Sie es eilig und können nicht 12 bis 24 Stunden warten, ist
es möglich das andere für Ihre Eepseite den „jump“
Adresshelfer-Umlenkungs-Dienst benutzen. Dieses funktioniert innerhalb
einiger Minuten nach Eingabe des Schlüssels zu einem Adressbuch auf der
gleichen Seite.<br><br>
Zuerst testen Sie das mittels Aufruf folgender Dienste. Sobald das
klappt, können anderen diese Möglichkeit nutzen. (Ersetzen Sie
„meineseite.i2p“ durch Ihre Seite.)
<ul>
<li><a href="http://stats.i2p/cgi-bin/jump.cgi?a=meineseite.i2p">http://stats.i2p/cgi-bin/jump.cgi?a=meineseite.i2p</a> oder</li>
<li><a href="http://i2host.i2p/cgi-bin/i2hostjump?meineseite.i2p">http://i2host.i2p/cgi-bin/i2hostjump?meineseite.i2p</a>
<br>
<br></li>
</ul></li>
<li>Manche Leute erkundigen sich auf Eepsites-Listen wie <a href="http://inproxy.tino.i2p/status.php">inproxy.tino.i2p/status.php</a> über neue Eepsites, so könnten Sie an einige Besucher kommen. Aber es gibt weitere Wege sich anzukündigen:
<ul>
<li>Veröffentlichen Sie eine Nachricht im <a href="http://forum.i2p">I2P Forum</a> unter <a href="http://forum.i2p/viewforum.php?f=16">Eepsite Announce</a></li>
<li>Besuchen sie die IRC-Kanäle #i2p oder #i2p-chat (beide englischsprachig) und Werben Sie sanft für sich.</li>
<li>Verbreiten Sie eine Nachricht über Syndie.</li>
<li>Tragen Sie sich ein in Ughas <a href="http://ugha.i2p/EepsiteIndex">Eepsite Index</a> Wiki.
<br>
<br></li>
</ul></li>
<li>Bitte beachten Sie, einige Seiten empfehlen das Einfügen des langen
„Destination“-Schlüssels; das können Sie wenn Sie möchten aber wenn
Sie Ihren Schlüssel erfolgreich beim „Schlüssel-Dienst“ eingetragen und
ihn mittels „jump“-Dienst getestet haben, sollte nach 24 Stunden
Wartezeit dieses Vorgehen nicht nötig sein.
<br>
<br></li>
<li>Sollten Sie Fragen haben, benutzen Sie den IRC-Kanal #i2p oder die technische Abteilung im <a href="http://forum.i2p">I2P Forum</a></li>
</ul>
<hr><p class="footnote"><a class="footnum" name="fn.1" href="#fnr.1">1.</a> <strong>Base64</strong>
beschreibt ein Verfahren zur Kodierung von 8-Bit-Binärdaten in eine
Zeichenfolge, die nur aus wenigen, Codepage-unabhängigen ASCII-Zeichen
besteht.
</p><p class="footnote"><a class="footnum" name="fn.2" href="#fnr.2">2.</a> Anmerkung: Wenn dieses Vorgehen mit der Fehlermeldung „Invalid nonce. Are you being spoofed?“ quittiert wird, müssen <em>Cookies</em> im Browser erlaubt werden. Ist dies nicht möglich, können Sie mit einem Editor die Datei <em>„i2p/userhosts.txt“</em> bearbeiten und so die Adressen einfügen. <a href="http://sperrbezirk.i2p/Konqueror_Susi.html">Konqueror</a> ist etwas eigenwillig.
</p><p class="footnote"><a class="footnum" name="fn.3" href="#fnr.3">3.</a> Gleiches wie unter <sup><a class="footref" name="fnr.2" href="#fn.2">2</a></sup> gilt für <em>„i2p/addressbook/subscriptions.txt“</em>.</p>
</div></div>
</body></html>

View File

@@ -1,118 +1,118 @@
<html>
<head>
<title>I2P serveur web anonyme | Bienvenue à votre eepsite</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link rel="shortcut icon" href="favicon.ico" />
<link rel="stylesheet" type="text/css" href="lib/eepsite.css" />
</head>
<body>
<div class="fairylights">
<div class="main">
<h1>Serveur web anonyme I2P</h1>
<div class="langbar">
<!-- Most of these languages listed here are yet to be translated -->
<a href="index.html"><img src="lib/us.png" title="English" alt="English"></a>
<a href="index_na.html"><img src="lib/cn.png" title="Chinese" alt="Chinese"></a>
<a href="index_de.html"><img src="lib/de.png" title="Deutsch" alt="Deutsch"></a>
<a href="index_fr.html"><img src="lib/fr.png" title="Français" alt="Français"></a>
<a href="index_na.html"><img src="lib/nl.png" title="Nederlands" alt="Nederlands"></a>
<a href="index_na.html"><img src="lib/se.png" title="Svenska" alt="Svenska"></a>
</div>
<h2>Un mini guide pour faire un serveur web anonyme utilisant I2P</h2>
<p>C'est votre eepsite qui fonctionne sur votre propre serveur web anonyme I2P. Afin de le mettre en route, simplement éditer les fichiers sous ./eepsite/docroot/
et ils seront accessibles aux autres internautes dès que vous avez suivi les instructions suivantes.
Avec I2P, on accède aux eepsites en utilisant une 'clé', qui est réprésentée par une chaîne de caractères de base64.
(Cette 'clé' est un analogue d'une adresse IP et elle est montrée sur l'eepsite's I2PTunnel
<a href="http://127.0.0.1:7657/i2ptunnel/edit.jsp?tunnel=3">Page de configuration</a>).
Les instructions ci dessous expliquent comment associer un nom de site tel que "monsite.i2p" à votre clé et ensuite comment lancer votre eepsite.</p>
<p>Vous pouvez accéder votre eepsite localement via
<a href="http://127.0.0.1:7658/">http://127.0.0.1:7658/</a>.
</p>
<h2>Comment configurer et annoncer votre eepsite</h2>
Votre eepsite ne fonctionne pas par défaut.
Après que vous l'ayez lancé, il sera difficile à trouver pour les internautes, car ils n'ont pas le nom de votre site et votre longue clé base64.
Vous pourriez simplement distribuer cette très longue clé manuellement. Mais, heureusement il y un carnet d'adresse I2P
et plusieurs manières faciles de faire connaitre votre eepsite. Voici les instructions détaillées :
<ul>
<li>Choissisez un nom pour votre eepsite (<i>quelquechose</i>.i2p). Tout en minuscule.
D'abord, vérifiez dans le carnet d'adresse de votre router
<a href="http://127.0.0.1:7657/susidns/addressbook.jsp?book=router&filter=none">ici</a>,
ou dans le fichier i2p/hosts.txt pour voir si le nom a déjà été pris.
Entrez le nouveau nom de votre eepsite sur le
<a href="http://127.0.0.1:7657/i2ptunnel/edit.jsp?tunnel=3">eepsite i2ptunnel page de configuration</a>
où c'est marqué "Website name". Cela remplacera le nom défaut "mysite.i2p".
En outre, cochez "Auto Start". Votre eepsite démarrera automatiquement chaque fois que vous lancez votre router I2P.
Soyez certain de cliquer sur "Save".
<li>Cliquez sur le bouton marqué "start"
<a href="http://127.0.0.1:7657/i2ptunnel/index.jsp">main i2ptunnel page de configuration</a> pour lancer votre eepsite.
Maintenant vous devriez voir "eepsite" indiqué sous "Local Destinations" sur le côté gauche de votre
<a href="http://127.0.0.1:7657/index.jsp">I2P Router Console</a>.
Votre eepsite fonctionne.
<li>Surlignez la clé de "Local destination" en entier sur le
<a href="http://127.0.0.1:7657/i2ptunnel/edit.jsp?tunnel=3">eepsite i2ptunnel page de configuration</a>
et copiez-la pour la coller plus tard.
Soyez certain de copier la clé entière - elle a plus de 500 octets et elle se termine avec "AAAA".
<li>Entrez le nom et coller la clé de destination dans votre
<a href="http://127.0.0.1:7657/susidns/addressbook.jsp?book=master">master address book</a>.
Cliquez sur "Add" pour ajouter la destination à votre carnet d'adresse.
<li>Dans votre explorateur internet, entrez le nom de votre eepsite (<i>quelquechose</i>.i2p) et vous devriez vous retrouver sur cette page.
Avec un peu de chance - si vous êtes arrivé ici, c'est que ça a marché !
<li>Avant de parler à tout le monde de votre nouvel eepsite, vous devriez ajouter du contenu.
Allez à i2p/eepsite/docroot et remplacez la page index.html avec votre propre page. Les dossiers virtuels fonctionnent, donc vous pouvez héberger un sous-dossier sans explicitement ajouter des liens vers des fichiers. Si vous avez besoin d'un gabarit pour un site de base, n'hésitez pas à utiliser et à changer <a href="pagetemplate.html">cette page</a> et <a href="lib/">contenu</a>!
</ul>
<h2>Enregistrer votre propre .I2P domaine</h2><ul>
<li>Maintenant il faut ajouter votre eepsite au carnet d'adresse hébergé par un site
tel que <a href="http://stats.i2p/">stats.i2p</a>.
C'est-à-dire, vous devez entrer
votre nom d'eepsite et sa clé dans l'interface web d'un ou plus de ces sites.
Voici <a href="http://stats.i2p/i2p/addkey.html">le formulaire pour l'entrée d'une clé à stats.i2p.</a>
Encore, votre clé est la "Local destination", disponible en entier ici
<a href="http://127.0.0.1:7657/i2ptunnel/edit.jsp?tunnel=3">eepsite i2ptunnel page de configuration.</a>
Prenez toute la clé, souvenez qu'elle se termine en "AAAA".
N'oubliez pas de cliquer sur "add a key".
Vérifiez que le site montre que la clé a été correctement ajoutée.
Comme beaucoup de routers se mettent à jour regulièrement à partir de ces sites, en quelques heures d'autres internautes seront capables de trouver et d'accéder à votre eepsite simplement en tapant <i>quelquechose</i>.i2p dans leurs explorateurs internet.
</ul><h2>Comment ajouter des abonnements au carnet d'adresse.</h2><ul>
<li>En parlant de mises à jour de carnet d'adresse, il serait prudent d'ajouter quelques carnets d'adresses de plus
à votre <a href="http://127.0.0.1:7657/susidns/subscriptions.jsp">subscription list.</a> Allez sur votre page d'abonnements et ajoutez quelques listes directement ci dessous afin que votre liste d'hôtes soit mise à jour automatiquement :<ul>
<li><a href="http://tino.i2p/hosts.txt">http://tino.i2p/hosts.txt</a>
<li><a href="http://stats.i2p/cgi-bin/newhosts.txt">http://stats.i2p/cgi-bin/newhosts.txt</a>
<li><a href="http://i2host.i2p/cgi-bin/i2hostetag">http://i2host.i2p/cgi-bin/i2hostetag</a></ul>
<li>Si vous êtes pressé et que vous ne pouvez pas attendre quelques heures, vous pouvez demander aux autres d'utiliser un "jump" (service d'aide de ré-direction d'adresse).
Cela marchera en quelques minutes après que vous ayez entré votre clé dans le carnet d'adresse sur le même site.
Testez-le vous-même en entrant :
http://stats.i2p/cgi-bin/jump.cgi?a=<i>quelquechose</i>.i2p
ou http://i2host.i2p/cgi-bin/i2hostjump?<i>quelquechose</i>.i2p
dans votre explorateur internet.
Dès que cela fonctionne, vous pouvez en parler aux autres.
<li>Certains personnes vérifient les nouveaux eepsites sur les listes tels que
<a href="http://inproxy.tino.i2p/status.php">inproxy.tino.i2p/status.php</a>. Vous pouvez commencer à avoir
quelques visiteurs. Il y a beaucoup des manières d'informers les autres. Voici quelques idées :
<ul>
<li>Poster un message sur le <a href="http://forum.i2p/viewforum.php?f=16">Eepsite announce forum</a>
sur <a href="http://forum.i2p/">forum.i2p</a>.
<li>Parlez aux autres sur les canaux #i2p ou #i2p-chat sur IRC.
<li>Mettez-le dans un post <a href="http://syndie.i2p2.de/">le nouveau Syndie</a>.
<li>Placez-le sur <a href="http://ugha.i2p/EepsiteIndex">Ugha's Eepsite Index Wiki</a>
</ul>
A noter que certains sites recommandent de coller la clé de destination directement. Vous pouvez si vous voulez,
mais si vous avez déjà réussi à poster la clé sur un service de "add key" (type stats.i2p), et attendu 24 heures pour que le carnet d'adresse
se propage aux autres, cela ne doit pas être nécessaire. </ul>
<h2>Plus d'assistance</h2><ul>
<li>Si vous avez plus de questions, trouvez du soutien à ces endroits :
<ul>
<li>Notre canal IRC de soutien : <ul><li><a href="irc://irc.freenode.net/i2p">#i2p sur Freenode</a>
<li>En anonymat via votre <a href="irc://127.0.0.1:6668/i2p">I2P IRC tunnel</a>.</ul>
<li><a href="http://forum.i2p/viewforum.php?f=10">The technical problems section</a> sur
<a href="http://forum.i2p/">forum.i2p</a>.</ul>
</ul><div class="notify">
<b>Note:</b> This page, the website and the console all need translating into YOUR language if it's not already been done or in progress. Please consider helping the project grow by <a href="http://www.i2p2.i2p/getinvolved.html">volunteering your time</a> to translate. Contact the project via the IRC channel listed above. Thanks in advance!</div>
<hr><div class="footnote">
Document last edited: November 2009.</div>
</div></div>
</body>
</html>
<html>
<head>
<title>I2P serveur web anonyme | Bienvenue à votre eepsite</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link rel="shortcut icon" href="favicon.ico" />
<link rel="stylesheet" type="text/css" href="lib/eepsite.css" />
</head>
<body>
<div class="fairylights">
<div class="main">
<h1>Serveur web anonyme I2P</h1>
<div class="langbar">
<!-- Most of these languages listed here are yet to be translated -->
<a href="index.html"><img src="lib/us.png" title="English" alt="English"></a>
<a href="index_na.html"><img src="lib/cn.png" title="中文" alt="中文"></a>
<a href="index_de.html"><img src="lib/de.png" title="Deutsch" alt="Deutsch"></a>
<a href="index_fr.html"><img src="lib/fr.png" title="Français" alt="Français"></a>
<a href="index_na.html"><img src="lib/nl.png" title="Nederlands" alt="Nederlands"></a>
<a href="index_ru.html"><img src="lib/ru.png" title="Русский" alt="Русский"></a>
<a href="index_na.html"><img src="lib/se.png" title="Svenska" alt="Svenska"></a>
</div>
<h2>Un mini guide pour faire un serveur web anonyme utilisant I2P</h2>
<p>C'est votre eepsite qui fonctionne sur votre propre serveur web anonyme I2P. Afin de le mettre en route, simplement éditer les fichiers sous ./eepsite/docroot/
et ils seront accessibles aux autres internautes dès que vous avez suivi les instructions suivantes.
Avec I2P, on accède aux eepsites en utilisant une 'clé', qui est réprésentée par une chaîne de caractères de base64.
(Cette 'clé' est un analogue d'une adresse IP et elle est montrée sur l'eepsite's I2PTunnel
<a href="http://127.0.0.1:7657/i2ptunnel/edit.jsp?tunnel=3">Page de configuration</a>).
Les instructions ci dessous expliquent comment associer un nom de site tel que "monsite.i2p" à votre clé et ensuite comment lancer votre eepsite.</p>
<p>Vous pouvez accéder votre eepsite localement via
<a href="http://127.0.0.1:7658/">http://127.0.0.1:7658/</a>.
</p>
<h2>Comment configurer et annoncer votre eepsite</h2>
Votre eepsite ne fonctionne pas par défaut.
Après que vous l'ayez lancé, il sera difficile à trouver pour les internautes, car ils n'ont pas le nom de votre site et votre longue clé base64.
Vous pourriez simplement distribuer cette très longue clé manuellement. Mais, heureusement il y un carnet d'adresse I2P
et plusieurs manières faciles de faire connaitre votre eepsite. Voici les instructions détaillées :
<ul>
<li>Choissisez un nom pour votre eepsite (<i>quelquechose</i>.i2p). Tout en minuscule.
D'abord, vérifiez dans le carnet d'adresse de votre router
<a href="http://127.0.0.1:7657/susidns/addressbook.jsp?book=router&filter=none">ici</a>,
ou dans le fichier i2p/hosts.txt pour voir si le nom a déjà été pris.
Entrez le nouveau nom de votre eepsite sur le
<a href="http://127.0.0.1:7657/i2ptunnel/edit.jsp?tunnel=3">eepsite i2ptunnel page de configuration</a>
où c'est marqué "Website name". Cela remplacera le nom défaut "mysite.i2p".
En outre, cochez "Auto Start". Votre eepsite démarrera automatiquement chaque fois que vous lancez votre router I2P.
Soyez certain de cliquer sur "Save".
<li>Cliquez sur le bouton marqué "start"
<a href="http://127.0.0.1:7657/i2ptunnel/index.jsp">main i2ptunnel page de configuration</a> pour lancer votre eepsite.
Maintenant vous devriez voir "eepsite" indiqué sous "Local Destinations" sur le côté gauche de votre
<a href="http://127.0.0.1:7657/index.jsp">I2P Router Console</a>.
Votre eepsite fonctionne.
<li>Surlignez la clé de "Local destination" en entier sur le
<a href="http://127.0.0.1:7657/i2ptunnel/edit.jsp?tunnel=3">eepsite i2ptunnel page de configuration</a>
et copiez-la pour la coller plus tard.
Soyez certain de copier la clé entière - elle a plus de 500 octets et elle se termine avec "AAAA".
<li>Entrez le nom et coller la clé de destination dans votre
<a href="http://127.0.0.1:7657/susidns/addressbook.jsp?book=master">master address book</a>.
Cliquez sur "Add" pour ajouter la destination à votre carnet d'adresse.
<li>Dans votre explorateur internet, entrez le nom de votre eepsite (<i>quelquechose</i>.i2p) et vous devriez vous retrouver sur cette page.
Avec un peu de chance - si vous êtes arrivé ici, c'est que ça a marché !
<li>Avant de parler à tout le monde de votre nouvel eepsite, vous devriez ajouter du contenu.
Allez à i2p/eepsite/docroot et remplacez la page index.html avec votre propre page. Les dossiers virtuels fonctionnent, donc vous pouvez héberger un sous-dossier sans explicitement ajouter des liens vers des fichiers. Si vous avez besoin d'un gabarit pour un site de base, n'hésitez pas à utiliser et à changer <a href="pagetemplate.html">cette page</a> et <a href="lib/">contenu</a>!
</ul>
<h2>Enregistrer votre propre .I2P domaine</h2><ul>
<li>Maintenant il faut ajouter votre eepsite au carnet d'adresse hébergé par un site
tel que <a href="http://stats.i2p/">stats.i2p</a>.
C'est-à-dire, vous devez entrer
votre nom d'eepsite et sa clé dans l'interface web d'un ou plus de ces sites.
Voici <a href="http://stats.i2p/i2p/addkey.html">le formulaire pour l'entrée d'une clé à stats.i2p.</a>
Encore, votre clé est la "Local destination", disponible en entier ici
<a href="http://127.0.0.1:7657/i2ptunnel/edit.jsp?tunnel=3">eepsite i2ptunnel page de configuration.</a>
Prenez toute la clé, souvenez qu'elle se termine en "AAAA".
N'oubliez pas de cliquer sur "add a key".
Vérifiez que le site montre que la clé a été correctement ajoutée.
Comme beaucoup de routers se mettent à jour regulièrement à partir de ces sites, en quelques heures d'autres internautes seront capables de trouver et d'accéder à votre eepsite simplement en tapant <i>quelquechose</i>.i2p dans leurs explorateurs internet.
</ul><h2>Comment ajouter des abonnements au carnet d'adresse.</h2><ul>
<li>En parlant de mises à jour de carnet d'adresse, il serait prudent d'ajouter quelques carnets d'adresses de plus
à votre <a href="http://127.0.0.1:7657/susidns/subscriptions.jsp">subscription list.</a> Allez sur votre page d'abonnements et ajoutez quelques listes directement ci dessous afin que votre liste d'hôtes soit mise à jour automatiquement :<ul>
<li><a href="http://tino.i2p/hosts.txt">http://tino.i2p/hosts.txt</a>
<li><a href="http://stats.i2p/cgi-bin/newhosts.txt">http://stats.i2p/cgi-bin/newhosts.txt</a>
<li><a href="http://i2host.i2p/cgi-bin/i2hostetag">http://i2host.i2p/cgi-bin/i2hostetag</a></ul>
<li>Si vous êtes pressé et que vous ne pouvez pas attendre quelques heures, vous pouvez demander aux autres d'utiliser un "jump" (service d'aide de ré-direction d'adresse).
Cela marchera en quelques minutes après que vous ayez entré votre clé dans le carnet d'adresse sur le même site.
Testez-le vous-même en entrant :
http://stats.i2p/cgi-bin/jump.cgi?a=<i>quelquechose</i>.i2p
ou http://i2host.i2p/cgi-bin/i2hostjump?<i>quelquechose</i>.i2p
dans votre explorateur internet.
Dès que cela fonctionne, vous pouvez en parler aux autres.
<li>Certains personnes vérifient les nouveaux eepsites sur les listes tels que
<a href="http://inproxy.tino.i2p/status.php">inproxy.tino.i2p/status.php</a>. Vous pouvez commencer à avoir
quelques visiteurs. Il y a beaucoup des manières d'informers les autres. Voici quelques idées :
<ul>
<li>Poster un message sur le <a href="http://forum.i2p/viewforum.php?f=16">Eepsite announce forum</a>
sur <a href="http://forum.i2p/">forum.i2p</a>.
<li>Parlez aux autres sur les canaux #i2p ou #i2p-chat sur IRC.
<li>Mettez-le dans un post <a href="http://syndie.i2p2.de/">le nouveau Syndie</a>.
<li>Placez-le sur <a href="http://ugha.i2p/EepsiteIndex">Ugha's Eepsite Index Wiki</a>
</ul>
A noter que certains sites recommandent de coller la clé de destination directement. Vous pouvez si vous voulez,
mais si vous avez déjà réussi à poster la clé sur un service de "add key" (type stats.i2p), et attendu 24 heures pour que le carnet d'adresse
se propage aux autres, cela ne doit pas être nécessaire. </ul>
<h2>Plus d'assistance</h2><ul>
<li>Si vous avez plus de questions, trouvez du soutien à ces endroits :
<ul>
<li>Notre canal IRC de soutien : <ul><li><a href="irc://irc.freenode.net/i2p">#i2p sur Freenode</a>
<li>En anonymat via votre <a href="irc://127.0.0.1:6668/i2p">I2P IRC tunnel</a>.</ul>
<li><a href="http://forum.i2p/viewforum.php?f=10">The technical problems section</a> sur
<a href="http://forum.i2p/">forum.i2p</a>.</ul>
</ul><div class="notify">
<b>Note:</b> This page, the website and the console all need translating into YOUR language if it's not already been done or in progress. Please consider helping the project grow by <a href="http://www.i2p2.i2p/getinvolved.html">volunteering your time</a> to translate. Contact the project via the IRC channel listed above. Thanks in advance!</div>
<hr><div class="footnote">
Document last edited: November 2009.</div>
</div></div>
</body>
</html>

View File

@@ -0,0 +1,40 @@
<html>
<head>
<title>I2P Anonymous Webserver | I'm a non-translated welcome page</title>
<link rel="shortcut icon" href="favicon.ico" />
<link rel="stylesheet" type="text/css" href="lib/eepsite.css" />
</head>
<body>
<div class="fairylights">
<div class="main">
<h1>I2P Anonymous Webserver</h1>
<div class="langbar">
<!-- Most of these languages listed here are yet to be translated -->
<a href="index.html"><img src="lib/us.png" title="English" alt="English"></a>
<a href="index_na.html"><img src="lib/cn.png" title="中文" alt="中文"></a>
<a href="index_de.html"><img src="lib/de.png" title="Deutsch" alt="Deutsch"></a>
<a href="index_fr.html"><img src="lib/fr.png" title="Français" alt="Français"></a>
<a href="index_na.html"><img src="lib/nl.png" title="Nederlands" alt="Nederlands"></a>
<a href="index_ru.html"><img src="lib/ru.png" title="Русский" alt="Русский"></a>
<a href="index_na.html"><img src="lib/se.png" title="Svenska" alt="Svenska"></a>
</div>
<h2>Help translate this page into your language!</h2>
<div class="notify">
If you're viewing this page and not an actual translation of the welcome page into your
native tongue, that's because it hasn't been done yet! I2P
needs your help! Please consider helping I2P become more accessible
to non-English speakers by volunteering some time translating the following :
<ul>
<li><a href="http://www.i2p2.i2p">the website</a>
<li><a href="http://127.0.0.1:7657">the console</a>
<li><a href="index.html">the eepsite quick guide</a></ul>
Please visit our IRC support channel via <a href="irc://irc.freenode.net/i2p">#i2p on Freenode</a> or
anonymously via your resident <a href="irc://127.0.0.1:6668/i2p">I2P IRC tunnel</a> for more information.</div>
<hr><div class="footnote">
Document last edited: November 2009.</div>
</div>
</div>
</body>
</html>

View File

@@ -0,0 +1,102 @@
<html>
<head>
<title>Анонимный I2P веб-сервер | Добро пожаловать на ваш I2P-сайт</title>
<link rel="shortcut icon" href="favicon.ico" />
<link rel="stylesheet" type="text/css" href="lib/eepsite.css" />
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
<div class="fairylights">
<div class="main">
<h1>Анонимный I2P веб-сервер</h1>
<div class="langbar">
<!-- Most of these languages listed here are yet to be translated -->
<a href="index.html"><img src="lib/us.png" title="English" alt="English"></a>
<a href="index_na.html"><img src="lib/cn.png" title="中文" alt="中文"></a>
<a href="index_de.html"><img src="lib/de.png" title="Deutsch" alt="Deutsch"></a>
<a href="index_fr.html"><img src="lib/fr.png" title="Français" alt="Français"></a>
<a href="index_na.html"><img src="lib/nl.png" title="Nederlands" alt="Nederlands"></a>
<a href="index_ru.html"><img src="lib/ru.png" title="Русский" alt="Русский"></a>
<a href="index_se.html"><img src="lib/se.png" title="Svenska" alt="Svenska"></a>
</div>
<h2>Краткое руководство по анонимному хостингу сайтов в I2P</h2>
<p>
Эта страничка - Ваш I2P-сайт, Ваш собственный анонимный I2P-вебсервер. Отредактируйте файлы в директории ~/.i2p/eepsite/docroot/ (Linux) или %APPDATA%\I2P\eepsite\docroot\ (Windows), выполните шаги из инструкции ниже и Ваш сайт увидят другие пользователи.
В I2P сайты адресуются по их «ключу», который выглядит как очень длинная Base64 строка. Этот «ключ» частично выполняет функцию IP-адреса и указан на
<a href="http://127.0.0.1:7657/i2ptunnel/edit.jsp?tunnel=3">странице настроек туннеля i2p-сайта</a>. Далее мы расскажем Вам, как присвоить своему ключу имя типа «mysite.i2p» и запустить Ваш i2p-сайт.
</p>
<p>Попробуйте открыть локально свой i2p-сайт через <a href="http://127.0.0.1:7658/">http://127.0.0.1:7658/</a>.
</p>
<h2>Как запустить и анонсировать свой I2P-сайт</h2>
Ваш i2p-сайт по умолчанию остановлен. Хотя Вы его и запустили, другим людям трудно его найти, ведь у сайта пока нет имени, а Ваш очень-длинный-Base64-ключ никому не известен. Вы, конечно, можете просто выдавать людям этот очень-длинный-Base64-ключ, но, к счастью, в I2P есть механизм адресных книг и несколько простых способов для сообщения людям о своем сайте. Далее подробные инструкции.
<ul>
<li>Выберите имя для своего сайта (<i>something</i>.i2p). Используйте только символы в нижнем регистре. Загляните в <a href="http://127.0.0.1:7657/susidns/addressbook.jsp?book=router&filter=none">адресную книгу</a> Вашего маршрутизатора или в файл i2p/hosts.txt для проверки, возможно такое имя уже кто-то занял. Введите новое имя Вашего сайта на <a href="http://127.0.0.1:7657/i2ptunnel/edit.jsp?tunnel=3">странице настроек туннеля для i2p-сайта</a> в поле «Имя веб-сайта». Это заменит имя сайта по умолчанию «mysite.i2p». Поставьте галочку «Автозапуск». Ваш сайт будет доступен извне всегда, когда запущен Ваш маршрутизатор. Не забудьте нажать «Сохранить».
<li>Кликните <a href="http://127.0.0.1:7657/i2ptunnel/index.jsp">в менеджере туннелей</a> на кнопке запуска вашего сайта. Вы должны увидеть запись «i2p-сайт» в списке «Локальные туннели» в левой части <a href="http://127.0.0.1:7657/index.jsp">консоли маршрутизатора</a>. С этого момента Ваш сайт запущен.
<li>Выделите всю строчку «Локальный адрес назначения» на <a href="http://127.0.0.1:7657/i2ptunnel/edit.jsp?tunnel=3">странице настроек туннеля вашего I2P-сайта</a> и скопируйте её. Убедитесь, что Вы скопировали строку целиком ее длина больше 500 символов, строка должна заканчиваться на «AAAA».
<li>Введите имя и вставьте ключ в Вашу <a href="http://127.0.0.1:7657/susidns/addressbook.jsp?book=master">основную адресную книгу</a>. Нажмите «Добавить» для добавления адреса в адресную книгу.
<li>Введите в браузере имя Вашего сайта (<i>something</i>.i2p), Вы должны снова попасть на эту страницу. Надеемся, что это сработало.
<li>Перед тем как Вы сообщите миру о своем новом сайте, имеет смысл добавить на него какой-нибудь контент. Зайдите в директорию ~/.i2p/eepsite/docroot/ (Linux) или %APPDATA%\I2P\eepsite\docroot\ (Windows) и замените заготовку страницы index.html на Вашу информацию. Есть поддержка виртуальных папок, так что можно выкладывать файлы из поддиректорий. Если Вам нужна заготовка простого сайта, не стесняйтесь взять за основу <a href="pagetemplate.html">эту страницу</a> и <a href="lib/">эти элементы оформления</a>!
</ul>
<h2>Зарегистрируйте свой .I2P домен</h2><ul>
<li>Теперь пора добавить Ваш сайт в адресные книги, расположенные на сайтах-каталогах, например <a href="http://stats.i2p/">stats.i2p</a>. Введите имя и ключ своего сайта через веб-интерфейс нескольких таких сайтов-каталогов. Вот <a href="http://stats.i2p/i2p/addkey.html">форма для ввода ключа на сайте stats.i2p</a>. Напоминаем, ключ — это вся строка «Локальный адрес назначения» на <a href="http://127.0.0.1:7657/i2ptunnel/edit.jsp?tunnel=3">странице настройки туннеля «I2P webserver»</a>. Проверьте, что Вы скопировали его целиком, включая «AAAA» на конце. Не забудьте нажать «Add a key». Дождитесь пока система отрапортует, что ключ был добавлен. Поскольку многие маршрутизаторы периодически обновляют свои адресные книги, обращаясь к этим сайтам-каталогам, уже через несколько часов кто-нибудь откроет Ваш сайт, просто набрав <i>something</i>.i2p в адресной строке браузера.
</ul>
<h2>Добавление подписок в адресную книгу</h2><ul>
<li>Кстати об обновлениях, самое время добавить несколько адресных книг в Ваш <a href="http://127.0.0.1:7657/susidns/subscriptions.jsp">список подписки</a>. Зайдите на страницу настройки подписок и добавьте эти ссылки для получения автоматически обновляемого списка сайтов:
<ul>
<li><a href="http://tino.i2p/hosts.txt">http://tino.i2p/hosts.txt</a>
<li><a href="http://stats.i2p/cgi-bin/newhosts.txt">http://stats.i2p/cgi-bin/newhosts.txt</a>
<li><a href="http://i2host.i2p/cgi-bin/i2hostetag">http://i2host.i2p/cgi-bin/i2hostetag</a>
</ul>
<li> Если Вы не можете ждать несколько часов, попробуйте воспользоваться jump-сервисом. Это возможно сразу (через несколько минут) после добавления ключа в адресную книгу на любой сайт-каталог (см. список в первом пункте). Проверьте сами — откройте в браузере http://stats.i2p/cgi-bin/jump.cgi?a=<i>something</i>.i2p или http://i2host.i2p/cgi-bin/i2hostjump?<i>something</i>.i2p. # Если это сработало для Вас, Ваши гости тоже смогут воспользоваться этим способом.
<li>Некоторые люди следят за обновлениями в списках i2p-сайтов, например <a href="http://inproxy.tino.i2p/status.php">inproxy.tino.i2p/status.php</a>, так что скоро у Вас появятся первые посетители. Всех остальных Вы можете оповестить другими способами. Например:
<ul>
<li>Напишите сообщение на форуме в разделе <a href="http://forum.i2p/viewforum.php?f=16">Eepsite announce</a>
<li>Расскажите о сайте в IRC на каналах #i2p или #i2p-chat
<li>Упомяните о сайте в постинге <a href="http://syndie.i2p2.de/">в Syndie</a>.
<li>Добавьте сайт в wiki <a href="http://ugha.i2p/EepsiteIndex">Ugha's Eepsite Index</a>
</ul>
Некоторые сайты рекомендуют вставлять в анонс Ваш очень-длинный-Base64-ключ. Вы, конечно, можете, если хотите. На самом деле, это не нужно, раз Вы уже добавили свой ключ на jump-сервисе, проверили его работу и подождали 24 часа, чтобы обновление адресной книги успело разойтись по всему I2P-миру.
</ul>
<h2>А что потом? </h2>
<ul>
<li>Если у вас остались вопросы, добро пожаловать на:
<ul>
<li>Наш IRC-канал поддержки:
<ul>
<li><a href="irc://irc.freenode.net/i2p">#i2p в сети Freenode</a>
<li>Анонимно доступен через <a href="irc://127.0.0.1:6668/i2p">встроенный IRC-туннель</a> Вашего I2P-маршрутизатора.
</ul>
<li>Раздел форума <a href="http://forum.i2p/viewforum.php?f=10">Technical Problems</a>.
</ul>
</ul>
<hr><div class="footnote">
На основе шаблонов: zzz, 07.10.2009 и dr|z3d, Ноябрь 2009.</div>
</div>
</body>
</html>

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 237 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 472 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 545 B

View File

@@ -0,0 +1,48 @@
body { background-color:#000000; color: #ffffe0; margin-left: 8%; margin-right: 8%; margin-top: 6%; margin-bottom: 6%; text-align: justify; background-image: url(bg.png); }
body,h1,h2,h3,h4,p,ul,ol,li,dl,dt,dd,div,td,th,address,blockquote {font-family: "Lucida Sans Unicode", "Bitstream Vera Sans", Verdana, Tahoma, Helvetica, sans-serif; }
h1 { font-size:23pt; margin-bottom:20pt; border-bottom: 1px solid #ffbb77; letter-spacing: 0.05em; text-shadow: 0px 0px 24px rgba(255, 96, 48, 0.9); background-image: url(itoopie.png); background-repeat: no-repeat; background-position: right top; line-height; 200% !important; padding-bottom: 10px; word-wrap: no-wrap;}
h1.ph1 { font-size:20pt; margin-bottom:18pt; margin-right: -5px; margin-leftL -5px;}
h2 { font-size:11.5pt; margin-bottom:15px; padding: 5px 10px; border: 1px solid #ffbb77; -moz-border-radius: 5px;background-color:#110500; font-variant: small-caps; text-transform: capitalize; letter-spacing: 0.07em; background-image: url(h2bg.png); background-repeat: no-repeat; background-position: right center;}
h3 { font-size:16pt; }
h4 { font-size:14pt; }
h5 { font-size:13pt; }
p,ul,ol,li,dl,dt,dd,div,td,th,address,blockquote { font-size:9.5pt; }
a.footref { font-size: 70%; }
a:link { color:#ffc266; text-decoration:none; }
a:visited { color:#ffd699; text-decoration:none; }
a:active { color:#ff9900; text-decoration:none; }
a:hover { color:#ffbb00; text-decoration:underline; }
a.nonexistent { color: #ffffe0; text-decoration:underline; }
a.nonexistent:visited { color: #ffffe0; text-decoration:none; }
a { font-weight: bold; font-size: 10pt; }
dl.contents { margin-top: 0; }
dt.contents { margin-bottom: 0; }
em { font-style: italic; }
li,dt { margin: 4px 0; padding-right: 25px; list-style: square;}
p.footnote { font-size: 90%; }
p.verse { white-space: pre; margin-left: 8.7%; }
pre { font-family: monospace; white-space: pre; margin-left: 8.7%; }
strong { font-weight: bold; }
table { width:100%; }png
td { border:0px solid #000; vertical-align:top; overflow:hidden; }
ul { list-style-type: disc; margin: 10px 0;}
/*
body { border: 1px solid #ffbb77; -moz-border-radius: 5px; padding: 25px; font-size: 9.5pt; -moz-box-shadow: inset 0px 0px 1px 0px #ffbb77; background-image: url(bg.png); background-repeat: no-repeat; background-position: center center;line-height: 135%; background-attachment: fixed;}
*/
hr { color: #fb7; background: #fb7; height: 1px; border: 0px solid #fb7; margin: 5px 0; }
div.langbar { margin-top: -25px; text-align: right; font-size: 8.5pt; }
div.langbar a { font-size: 8.5pt; outline: none;}
div.langbar img { border: 0; padding: 4px 2px 0 2px; opacity: 0.7; }
div.langbar img:hover { opacity: 1; }
div.langbar img:last-child { padding-right: 0; }
div.main { border: 2px solid #220800; -moz-border-radius: 5px; padding: 5px 25px 20px 25px; font-size: 9.5pt; -moz-box-shadow: inset 0px 0px 1px 0px #220800; background-color: #220800; background-image: url(brown.png);}
div.footnote { font-size: 7.5pt; font-style: italic; text-align: right; }
div.notify { padding: 10px; border: 1px solid #994400; background-color: #440A00; -moz-border-radius: 5px; margin: 15px 0 15px 0;}
div.fairylights { border: 1px solid #ffbb77; -moz-border-radius: 5px; padding: 1px; -moz-box-shadow: inset 0px 0px 1px 0px #ffbb77; background-color: #220800;}

Binary file not shown.

After

Width:  |  Height:  |  Size: 469 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 545 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 453 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 420 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 542 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 609 B

View File

@@ -0,0 +1,32 @@
<html>
<head>
<title>MY OWN EEPSITE</title>
<link rel="shortcut icon" href="favicon.ico" />
<link rel="stylesheet" type="text/css" href="lib/eepsite.css" />
</head>
<body>
<div class="fairylights">
<div class="main">
<h1>MY EEPSITE</h1>
<div class="langbar">
<!-- Most of these languages listed here are yet to be translated -->
<a href="index.html"><img src="lib/us.png" title="English" alt="English"></a>
<a href="index_na.html"><img src="lib/cn.png" title="中文" alt="中文"></a>
<a href="index_de.html"><img src="lib/de.png" title="Deutsch" alt="Deutsch"></a>
<a href="index_fr.html"><img src="lib/fr.png" title="Français" alt="Français"></a>
<a href="index_na.html"><img src="lib/nl.png" title="Nederlands" alt="Nederlands"></a>
<a href="index_ru.html"><img src="lib/ru.png" title="Русский" alt="Русский"></a>
<a href="index_na.html"><img src="lib/se.png" title="Svenska" alt="Svenska"></a>
</div>
<h2>Words and pictures and stuff</h2>
Your cool stuff here...
<div class="notify">
Bring more attention to something of interest here!
</div>
<hr><div class="footnote">
Document last edited: November 2009.</div>
</div>
</div>
</body>
</html>

View File

@@ -0,0 +1,7 @@
<html>
<head>
<meta http-equiv="refresh" content="1;url=/help/" />
<title>I2P Anonymous Webserver</title>
</head>
</body>
</html>

View File

@@ -1,4 +1,4 @@
#! /bin/sh
#!/bin/sh
#
# Skeleton sh script suitable for starting and stopping

Some files were not shown because too many files have changed in this diff Show More