propagate from branch 'i2p.i2p.zzz.i2psnark' (head 738b0ee2a3e938f83c8524d7ee1cbd66c83d7d56)

to branch 'i2p.i2p' (head 7bc276bf13158ca72d687031fdf5e9921efc5050)
This commit is contained in:
zzz
2008-12-01 02:51:28 +00:00
35 changed files with 299 additions and 115 deletions

View File

@ -2,6 +2,11 @@
<!-- You may freely edit this file. See commented blocks below for --> <!-- You may freely edit this file. See commented blocks below for -->
<!-- some examples of how to customize the build. --> <!-- some examples of how to customize the build. -->
<!-- (If you delete it and reopen the project it will be recreated.) --> <!-- (If you delete it and reopen the project it will be recreated.) -->
<!-- By default, only the Clean and Build commands use this build script. -->
<!-- Commands such as Run, Debug, and Test only use this build script if -->
<!-- the Compile on Save feature is turned off for the project. -->
<!-- You can turn off the Compile on Save (or Deploy on Save) setting -->
<!-- in the project's Project Properties dialog box.-->
<project name="BOB" default="default" basedir="."> <project name="BOB" default="default" basedir=".">
<description>Builds, tests, and runs the project BOB.</description> <description>Builds, tests, and runs the project BOB.</description>
<import file="nbproject/build-impl.xml"/> <import file="nbproject/build-impl.xml"/>

View File

@ -218,13 +218,13 @@ is divided into following sections:
</sequential> </sequential>
</macrodef> </macrodef>
</target> </target>
<target name="-init-macrodef-nbjpda"> <target depends="-init-debug-args" name="-init-macrodef-nbjpda">
<macrodef name="nbjpdastart" uri="http://www.netbeans.org/ns/j2se-project/1"> <macrodef name="nbjpdastart" uri="http://www.netbeans.org/ns/j2se-project/1">
<attribute default="${main.class}" name="name"/> <attribute default="${main.class}" name="name"/>
<attribute default="${debug.classpath}" name="classpath"/> <attribute default="${debug.classpath}" name="classpath"/>
<attribute default="" name="stopclassname"/> <attribute default="" name="stopclassname"/>
<sequential> <sequential>
<nbjpdastart addressproperty="jpda.address" name="@{name}" stopclassname="@{stopclassname}" transport="dt_socket"> <nbjpdastart addressproperty="jpda.address" name="@{name}" stopclassname="@{stopclassname}" transport="${debug-transport}">
<classpath> <classpath>
<path path="@{classpath}"/> <path path="@{classpath}"/>
</classpath> </classpath>
@ -255,6 +255,12 @@ is divided into following sections:
<condition else="-Xdebug" property="debug-args-line" value="-Xdebug -Xnoagent -Djava.compiler=none"> <condition else="-Xdebug" property="debug-args-line" value="-Xdebug -Xnoagent -Djava.compiler=none">
<istrue value="${have-jdk-older-than-1.4}"/> <istrue value="${have-jdk-older-than-1.4}"/>
</condition> </condition>
<condition else="dt_socket" property="debug-transport-by-os" value="dt_shmem">
<os family="windows"/>
</condition>
<condition else="${debug-transport-by-os}" property="debug-transport" value="${debug.transport}">
<isset property="debug.transport"/>
</condition>
</target> </target>
<target depends="-init-debug-args" name="-init-macrodef-debug"> <target depends="-init-debug-args" name="-init-macrodef-debug">
<macrodef name="debug" uri="http://www.netbeans.org/ns/j2se-project/3"> <macrodef name="debug" uri="http://www.netbeans.org/ns/j2se-project/3">
@ -264,7 +270,7 @@ is divided into following sections:
<sequential> <sequential>
<java classname="@{classname}" dir="${work.dir}" fork="true"> <java classname="@{classname}" dir="${work.dir}" fork="true">
<jvmarg line="${debug-args-line}"/> <jvmarg line="${debug-args-line}"/>
<jvmarg value="-Xrunjdwp:transport=dt_socket,address=${jpda.address}"/> <jvmarg value="-Xrunjdwp:transport=${debug-transport},address=${jpda.address}"/>
<jvmarg line="${run.jvmargs}"/> <jvmarg line="${run.jvmargs}"/>
<classpath> <classpath>
<path path="@{classpath}"/> <path path="@{classpath}"/>
@ -311,6 +317,13 @@ is divided into following sections:
=================== ===================
--> -->
<target depends="init" name="deps-jar" unless="no.deps"/> <target depends="init" name="deps-jar" unless="no.deps"/>
<target depends="init,-check-automatic-build,-clean-after-automatic-build" name="-verify-automatic-build"/>
<target depends="init" name="-check-automatic-build">
<available file="${build.classes.dir}/.netbeans_automatic_build" property="netbeans.automatic.build"/>
</target>
<target depends="init" if="netbeans.automatic.build" name="-clean-after-automatic-build">
<antcall target="clean"/>
</target>
<target depends="init,deps-jar" name="-pre-pre-compile"> <target depends="init,deps-jar" name="-pre-pre-compile">
<mkdir dir="${build.classes.dir}"/> <mkdir dir="${build.classes.dir}"/>
</target> </target>
@ -331,7 +344,7 @@ is divided into following sections:
<!-- Empty placeholder for easier customization. --> <!-- Empty placeholder for easier customization. -->
<!-- You can override this target in the ../build.xml file. --> <!-- You can override this target in the ../build.xml file. -->
</target> </target>
<target depends="init,deps-jar,-pre-pre-compile,-pre-compile,-do-compile,-post-compile" description="Compile project." name="compile"/> <target depends="init,deps-jar,-verify-automatic-build,-pre-pre-compile,-pre-compile,-do-compile,-post-compile" description="Compile project." name="compile"/>
<target name="-pre-compile-single"> <target name="-pre-compile-single">
<!-- Empty placeholder for easier customization. --> <!-- Empty placeholder for easier customization. -->
<!-- You can override this target in the ../build.xml file. --> <!-- You can override this target in the ../build.xml file. -->
@ -345,7 +358,7 @@ is divided into following sections:
<!-- Empty placeholder for easier customization. --> <!-- Empty placeholder for easier customization. -->
<!-- You can override this target in the ../build.xml file. --> <!-- You can override this target in the ../build.xml file. -->
</target> </target>
<target depends="init,deps-jar,-pre-pre-compile,-pre-compile-single,-do-compile-single,-post-compile-single" name="compile-single"/> <target depends="init,deps-jar,-verify-automatic-build,-pre-pre-compile,-pre-compile-single,-do-compile-single,-post-compile-single" name="compile-single"/>
<!-- <!--
==================== ====================
JAR BUILDING SECTION JAR BUILDING SECTION

View File

@ -1,8 +1,8 @@
build.xml.data.CRC32=209349b6 build.xml.data.CRC32=209349b6
build.xml.script.CRC32=05a1ffd9 build.xml.script.CRC32=403e69e6
build.xml.stylesheet.CRC32=be360661 build.xml.stylesheet.CRC32=958a1d3e
# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml. # This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml.
# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you. # Do not edit this file. You may delete it but then the IDE will never regenerate such files for you.
nbproject/build-impl.xml.data.CRC32=209349b6 nbproject/build-impl.xml.data.CRC32=209349b6
nbproject/build-impl.xml.script.CRC32=eeeca375 nbproject/build-impl.xml.script.CRC32=75fac64c
nbproject/build-impl.xml.stylesheet.CRC32=487672f9 nbproject/build-impl.xml.stylesheet.CRC32=e55b27f5

View File

@ -2,5 +2,5 @@ do.depend=false
do.jar=true do.jar=true
javac.debug=true javac.debug=true
javadoc.preview=true javadoc.preview=true
jaxws.endorsed.dir=/usr/local/netbeans-6.1/java2/modules/ext/jaxws21/api jaxws.endorsed.dir=/usr/local/netbeans-6.5/java2/modules/ext/jaxws21/api:/usr/local/netbeans-6.5/ide10/modules/ext/jaxb/api
user.properties.file=/root/.netbeans/6.1/build.properties user.properties.file=/root/.netbeans/6.5/build.properties

View File

@ -46,7 +46,7 @@ public class DoCMDS implements Runnable {
// FIX ME // FIX ME
// I need a better way to do versioning, but this will do for now. // I need a better way to do versioning, but this will do for now.
public static final String BMAJ = "00", BMIN = "00", BREV = "01", BEXT = "-C"; public static final String BMAJ = "00", BMIN = "00", BREV = "01", BEXT = "-D";
public static final String BOBversion = BMAJ + "." + BMIN + "." + BREV + BEXT; public static final String BOBversion = BMAJ + "." + BMIN + "." + BREV + BEXT;
private Socket server; private Socket server;
private Properties props; private Properties props;
@ -92,6 +92,7 @@ public class DoCMDS implements Runnable {
private static final String C_start = "start"; private static final String C_start = "start";
private static final String C_status = "status"; private static final String C_status = "status";
private static final String C_stop = "stop"; private static final String C_stop = "stop";
private static final String C_verify = "verify";
/* all the coomands available, plus description */ /* all the coomands available, plus description */
private static final String C_ALL[][] = { private static final String C_ALL[][] = {
@ -115,6 +116,7 @@ public class DoCMDS implements Runnable {
{C_start, C_start + " * Start the current nickname tunnel."}, {C_start, C_start + " * Start the current nickname tunnel."},
{C_status, C_status + " nickname * Display status of a nicknamed tunnel."}, {C_status, C_status + " nickname * Display status of a nicknamed tunnel."},
{C_stop, C_stop + " * Stops the current nicknamed tunnel."}, {C_stop, C_stop + " * Stops the current nicknamed tunnel."},
{C_verify, C_verify + " BASE64_key * Verifies BASE64 destination."},
{"", "COMMANDS: " + // this is ugly, but... {"", "COMMANDS: " + // this is ugly, but...
C_help + " " + C_help + " " +
C_clear + " " + C_clear + " " +
@ -135,7 +137,8 @@ public class DoCMDS implements Runnable {
C_show + " " + C_show + " " +
C_start + " " + C_start + " " +
C_status + " " + C_status + " " +
C_stop C_stop + " " +
C_verify
}, },
{" ", " "} // end of list {" ", " "} // end of list
}; };
@ -346,12 +349,12 @@ public class DoCMDS implements Runnable {
* @return * @return
*/ */
private boolean is64ok(String data) { private boolean is64ok(String data) {
String dest = new String(data); try {
if(dest.replaceAll("[a-zA-Z0-9~-]", "").length() == 0) { Destination x = new Destination(data);
return true; return true;
} catch(Exception e) {
return false;
} }
return false;
} }
/** /**
@ -619,6 +622,12 @@ die: {
} }
} }
}else if(Command.equals(C_verify)) {
if(is64ok(Arg)) {
out.println("OK");
} else {
out.println("ERROR not in BASE64 format");
}
} else if(Command.equals(C_setkeys)) { } else if(Command.equals(C_setkeys)) {
// Set the NamedDB to a privatekey in BASE64 format // Set the NamedDB to a privatekey in BASE64 format
if(ns) { if(ns) {

View File

@ -90,14 +90,14 @@ public class ConfigTunnelsHelper {
renderOptions(buf, 0, MAX_LENGTH, now, "", "hop"); renderOptions(buf, 0, MAX_LENGTH, now, "", "hop");
if (now > MAX_LENGTH) if (now > MAX_LENGTH)
renderOptions(buf, now, now, now, "", "hop"); renderOptions(buf, now, now, now, "", "hop");
buf.append("</td>\n"); buf.append("</select></td>\n");
buf.append("<td><select name=\"").append(index).append(".depthOutbound\">\n"); buf.append("<td><select name=\"").append(index).append(".depthOutbound\">\n");
now = out.getLength(); now = out.getLength();
renderOptions(buf, 0, MAX_LENGTH, now, "", "hop"); renderOptions(buf, 0, MAX_LENGTH, now, "", "hop");
if (now > MAX_LENGTH) if (now > MAX_LENGTH)
renderOptions(buf, now, now, now, "", "hop"); renderOptions(buf, now, now, now, "", "hop");
buf.append("</td>\n"); buf.append("</select></td>\n");
buf.append("</tr>\n"); buf.append("</tr>\n");
// tunnel depth variance // tunnel depth variance
@ -111,7 +111,7 @@ public class ConfigTunnelsHelper {
renderOptions(buf, now, now, now, "+ 0-", "hop"); renderOptions(buf, now, now, now, "+ 0-", "hop");
else if (now < MIN_NEG_VARIANCE) else if (now < MIN_NEG_VARIANCE)
renderOptions(buf, now, now, now, "+/- 0", "hop"); renderOptions(buf, now, now, now, "+/- 0", "hop");
buf.append("</td>\n"); buf.append("</select></td>\n");
buf.append("<td><select name=\"").append(index).append(".varianceOutbound\">\n"); buf.append("<td><select name=\"").append(index).append(".varianceOutbound\">\n");
now = out.getLengthVariance(); now = out.getLengthVariance();
@ -122,7 +122,7 @@ public class ConfigTunnelsHelper {
renderOptions(buf, now, now, now, "+ 0-", "hop"); renderOptions(buf, now, now, now, "+ 0-", "hop");
else if (now < MIN_NEG_VARIANCE) else if (now < MIN_NEG_VARIANCE)
renderOptions(buf, now, now, now, "+/- 0", "hop"); renderOptions(buf, now, now, now, "+/- 0", "hop");
buf.append("</td>\n"); buf.append("</select></td>\n");
// tunnel quantity // tunnel quantity
buf.append("<tr><td>Quantity</td>\n"); buf.append("<tr><td>Quantity</td>\n");
@ -131,14 +131,14 @@ public class ConfigTunnelsHelper {
renderOptions(buf, 1, MAX_QUANTITY, now, "", "tunnel"); renderOptions(buf, 1, MAX_QUANTITY, now, "", "tunnel");
if (now > MAX_QUANTITY) if (now > MAX_QUANTITY)
renderOptions(buf, now, now, now, "", "tunnel"); renderOptions(buf, now, now, now, "", "tunnel");
buf.append("</td>\n"); buf.append("</select></td>\n");
buf.append("<td><select name=\"").append(index).append(".quantityOutbound\">\n"); buf.append("<td><select name=\"").append(index).append(".quantityOutbound\">\n");
now = out.getQuantity(); now = out.getQuantity();
renderOptions(buf, 1, MAX_QUANTITY, now, "", "tunnel"); renderOptions(buf, 1, MAX_QUANTITY, now, "", "tunnel");
if (now > MAX_QUANTITY) if (now > MAX_QUANTITY)
renderOptions(buf, now, now, now, "", "tunnel"); renderOptions(buf, now, now, now, "", "tunnel");
buf.append("</td>\n"); buf.append("</select></td>\n");
buf.append("</tr>\n"); buf.append("</tr>\n");
// tunnel backup quantity // tunnel backup quantity
@ -148,14 +148,14 @@ public class ConfigTunnelsHelper {
renderOptions(buf, 0, MAX_QUANTITY, now, "", "tunnel"); renderOptions(buf, 0, MAX_QUANTITY, now, "", "tunnel");
if (now > MAX_QUANTITY) if (now > MAX_QUANTITY)
renderOptions(buf, now, now, now, "", "tunnel"); renderOptions(buf, now, now, now, "", "tunnel");
buf.append("</td>\n"); buf.append("</select></td>\n");
buf.append("<td><select name=\"").append(index).append(".backupOutbound\">\n"); buf.append("<td><select name=\"").append(index).append(".backupOutbound\">\n");
now = in.getBackupQuantity(); now = in.getBackupQuantity();
renderOptions(buf, 0, MAX_QUANTITY, now, "", "tunnel"); renderOptions(buf, 0, MAX_QUANTITY, now, "", "tunnel");
if (now > MAX_QUANTITY) if (now > MAX_QUANTITY)
renderOptions(buf, now, now, now, "", "tunnel"); renderOptions(buf, now, now, now, "", "tunnel");
buf.append("</td>\n"); buf.append("</select></td>\n");
buf.append("</tr>\n"); buf.append("</tr>\n");
// custom options // custom options

View File

@ -34,7 +34,7 @@ public class ConfigUpdateHandler extends FormHandler {
public static final String PROP_UPDATE_URL = "router.updateURL"; public static final String PROP_UPDATE_URL = "router.updateURL";
// public static final String DEFAULT_UPDATE_URL = "http://dev.i2p.net/i2p/i2pupdate.sud"; // public static final String DEFAULT_UPDATE_URL = "http://dev.i2p.net/i2p/i2pupdate.sud";
public static final String DEFAULT_UPDATE_URL = public static final String DEFAULT_UPDATE_URL =
"http://amiga.i2p/i2p/i2pupdate.sud\r\n" + "http://echelon.i2p/i2p/i2pupdate.sud\r\n" +
"http://stats.i2p/i2p/i2pupdate.sud\r\n" + "http://stats.i2p/i2p/i2pupdate.sud\r\n" +
"http://complication.i2p/i2p/i2pupdate.sud\r\n" + "http://complication.i2p/i2p/i2pupdate.sud\r\n" +
"http://www.i2p2.i2p/_static/i2pupdate.sud\r\n" + "http://www.i2p2.i2p/_static/i2pupdate.sud\r\n" +

View File

@ -28,11 +28,16 @@ class ConnectionDataReceiver implements MessageOutputStream.DataReceiver {
/** /**
* This tells the flusher in MessageOutputStream whether to flush. * This tells the flusher in MessageOutputStream whether to flush.
* It won't flush if this returns true. * It won't flush if this returns true.
* It was: return con.getUnackedPacketsSent() > 0; *
* It was: return con.getUnackedPacketsSent() > 0 (i.e. Nagle)
* But then, for data that fills more than one packet, the last part of * But then, for data that fills more than one packet, the last part of
* the data isn't sent until all the previous packets are acked. Which is very slow. * the data isn't sent until all the previous packets are acked. Which is very slow.
* The poor interaction of Nagle and Delayed Acknowledgements is well-documented.
* *
* So let's send data along unless the outbound window is full. * So let's send data along unless the outbound window is full.
* (i.e. no-Nagle or TCP_NODELAY)
*
* Probably should have a configuration option for this.
* *
* @return !flush * @return !flush
*/ */

View File

@ -56,7 +56,7 @@ public class ConnectionOptions extends I2PSocketOptionsImpl {
private static final int TREND_COUNT = 3; private static final int TREND_COUNT = 3;
static final int INITIAL_WINDOW_SIZE = 12; static final int INITIAL_WINDOW_SIZE = 12;
static final int DEFAULT_MAX_SENDS = 8; static final int DEFAULT_MAX_SENDS = 8;
public static final int DEFAULT_INITIAL_RTT = 10*1000;
static final int MIN_WINDOW_SIZE = 1; static final int MIN_WINDOW_SIZE = 1;
/** /**
@ -208,7 +208,7 @@ public class ConnectionOptions extends I2PSocketOptionsImpl {
setConnectDelay(getInt(opts, PROP_CONNECT_DELAY, -1)); setConnectDelay(getInt(opts, PROP_CONNECT_DELAY, -1));
setProfile(getInt(opts, PROP_PROFILE, PROFILE_BULK)); setProfile(getInt(opts, PROP_PROFILE, PROFILE_BULK));
setMaxMessageSize(getInt(opts, PROP_MAX_MESSAGE_SIZE, DEFAULT_MAX_MESSAGE_SIZE)); setMaxMessageSize(getInt(opts, PROP_MAX_MESSAGE_SIZE, DEFAULT_MAX_MESSAGE_SIZE));
setRTT(getInt(opts, PROP_INITIAL_RTT, 10*1000)); setRTT(getInt(opts, PROP_INITIAL_RTT, DEFAULT_INITIAL_RTT));
setReceiveWindow(getInt(opts, PROP_INITIAL_RECEIVE_WINDOW, 1)); setReceiveWindow(getInt(opts, PROP_INITIAL_RECEIVE_WINDOW, 1));
setResendDelay(getInt(opts, PROP_INITIAL_RESEND_DELAY, 1000)); setResendDelay(getInt(opts, PROP_INITIAL_RESEND_DELAY, 1000));
setSendAckDelay(getInt(opts, PROP_INITIAL_ACK_DELAY, 2000)); setSendAckDelay(getInt(opts, PROP_INITIAL_ACK_DELAY, 2000));
@ -237,7 +237,7 @@ public class ConnectionOptions extends I2PSocketOptionsImpl {
if (opts.containsKey(PROP_MAX_MESSAGE_SIZE)) if (opts.containsKey(PROP_MAX_MESSAGE_SIZE))
setMaxMessageSize(getInt(opts, PROP_MAX_MESSAGE_SIZE, Packet.MAX_PAYLOAD_SIZE)); setMaxMessageSize(getInt(opts, PROP_MAX_MESSAGE_SIZE, Packet.MAX_PAYLOAD_SIZE));
if (opts.containsKey(PROP_INITIAL_RTT)) if (opts.containsKey(PROP_INITIAL_RTT))
setRTT(getInt(opts, PROP_INITIAL_RTT, 10*1000)); setRTT(getInt(opts, PROP_INITIAL_RTT, DEFAULT_INITIAL_RTT));
if (opts.containsKey(PROP_INITIAL_RECEIVE_WINDOW)) if (opts.containsKey(PROP_INITIAL_RECEIVE_WINDOW))
setReceiveWindow(getInt(opts, PROP_INITIAL_RECEIVE_WINDOW, 1)); setReceiveWindow(getInt(opts, PROP_INITIAL_RECEIVE_WINDOW, 1));
if (opts.containsKey(PROP_INITIAL_RESEND_DELAY)) if (opts.containsKey(PROP_INITIAL_RESEND_DELAY))
@ -306,6 +306,7 @@ public class ConnectionOptions extends I2PSocketOptionsImpl {
} }
/** after how many consecutive messages should we ack? /** after how many consecutive messages should we ack?
* This doesn't appear to be used.
* @return receive window size. * @return receive window size.
*/ */
public int getReceiveWindow() { return _receiveWindow; } public int getReceiveWindow() { return _receiveWindow; }
@ -420,7 +421,7 @@ public class ConnectionOptions extends I2PSocketOptionsImpl {
* @return Maximum retrys before failing a sent message. * @return Maximum retrys before failing a sent message.
*/ */
public int getMaxResends() { return _maxResends; } public int getMaxResends() { return _maxResends; }
public void setMaxResends(int numSends) { _maxResends = numSends; } public void setMaxResends(int numSends) { _maxResends = Math.max(numSends, 0); }
/** /**
* What period of inactivity qualifies as "too long"? * What period of inactivity qualifies as "too long"?

View File

@ -38,7 +38,7 @@ import net.i2p.util.Log;
* <li>{@link #FLAG_SIGNATURE_INCLUDED}: {@link net.i2p.data.Signature}</li> * <li>{@link #FLAG_SIGNATURE_INCLUDED}: {@link net.i2p.data.Signature}</li>
* <li>{@link #FLAG_SIGNATURE_REQUESTED}: no option data</li> * <li>{@link #FLAG_SIGNATURE_REQUESTED}: no option data</li>
* <li>{@link #FLAG_FROM_INCLUDED}: {@link net.i2p.data.Destination}</li> * <li>{@link #FLAG_FROM_INCLUDED}: {@link net.i2p.data.Destination}</li>
* <li>{@link #FLAG_DELAY_REQUESTED}: 1 byte integer</li> * <li>{@link #FLAG_DELAY_REQUESTED}: 2 byte integer</li>
* <li>{@link #FLAG_MAX_PACKET_SIZE_INCLUDED}: 2 byte integer</li> * <li>{@link #FLAG_MAX_PACKET_SIZE_INCLUDED}: 2 byte integer</li>
* <li>{@link #FLAG_PROFILE_INTERACTIVE}: no option data</li> * <li>{@link #FLAG_PROFILE_INTERACTIVE}: no option data</li>
* </ol> * </ol>

View File

@ -74,7 +74,11 @@ public class UrlLauncher {
bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream("browser.reg"), "UTF-16")); bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream("browser.reg"), "UTF-16"));
for (String line; (line = bufferedReader.readLine()) != null; ) { for (String line; (line = bufferedReader.readLine()) != null; ) {
if (line.startsWith("@=")) { if (line.startsWith("@=")) {
browserString = "\"" + line.substring(3, line.toLowerCase().indexOf(".exe") + 4) + "\""; // we should really use the whole line and replace %1 with the url
browserString = line.substring(3, line.toLowerCase().indexOf(".exe") + 4);
if (browserString.startsWith("\\\""))
browserString = browserString.substring(2);
browserString = "\"" + browserString + "\"";
} }
} }
try { try {

View File

@ -332,6 +332,8 @@
<copy file="build/BOB.jar" todir="pkg-temp/lib/" /> <copy file="build/BOB.jar" todir="pkg-temp/lib/" />
<copy file="build/sam.jar" todir="pkg-temp/lib/" /> <copy file="build/sam.jar" todir="pkg-temp/lib/" />
<copy file="build/i2psnark.jar" todir="pkg-temp/lib" /> <copy file="build/i2psnark.jar" todir="pkg-temp/lib" />
<!-- include systray fixes in 0.6.5 -->
<copy file="build/systray.jar" todir="pkg-temp/lib/" />
<copy file="build/susimail.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/susidns.war" todir="pkg-temp/webapps/" />
<copy file="build/i2psnark.war" todir="pkg-temp/webapps/" /> <copy file="build/i2psnark.war" todir="pkg-temp/webapps/" />

View File

@ -15,7 +15,7 @@ package net.i2p;
*/ */
public class CoreVersion { public class CoreVersion {
public final static String ID = "$Revision: 1.72 $ $Date: 2008-08-24 12:00:00 $"; public final static String ID = "$Revision: 1.72 $ $Date: 2008-08-24 12:00:00 $";
public final static String VERSION = "0.6.4"; public final static String VERSION = "0.6.5";
public static void main(String args[]) { public static void main(String args[]) {
System.out.println("I2P Core version: " + VERSION); System.out.println("I2P Core version: " + VERSION);

View File

@ -91,7 +91,8 @@ public class I2PAppContext {
private volatile boolean _routingKeyGeneratorInitialized; private volatile boolean _routingKeyGeneratorInitialized;
private volatile boolean _randomInitialized; private volatile boolean _randomInitialized;
private volatile boolean _keyGeneratorInitialized; private volatile boolean _keyGeneratorInitialized;
/** /**
* Pull the default context, creating a new one if necessary, else using * Pull the default context, creating a new one if necessary, else using
* the first one created. * the first one created.
@ -105,7 +106,7 @@ public class I2PAppContext {
} }
return _globalAppContext; return _globalAppContext;
} }
/** /**
* Lets root a brand new context * Lets root a brand new context
* *
@ -113,6 +114,7 @@ public class I2PAppContext {
public I2PAppContext() { public I2PAppContext() {
this(true, null); this(true, null);
} }
/** /**
* Lets root a brand new context * Lets root a brand new context
* *
@ -120,6 +122,7 @@ public class I2PAppContext {
public I2PAppContext(Properties envProps) { public I2PAppContext(Properties envProps) {
this(true, envProps); this(true, envProps);
} }
/** /**
* @param doInit should this context be used as the global one (if necessary)? * @param doInit should this context be used as the global one (if necessary)?
*/ */
@ -175,6 +178,7 @@ public class I2PAppContext {
} }
return System.getProperty(propName, defaultValue); return System.getProperty(propName, defaultValue);
} }
/** /**
* Access the configuration attributes of this context, listing the properties * Access the configuration attributes of this context, listing the properties
* provided during the context construction, as well as the ones included in * provided during the context construction, as well as the ones included in
@ -194,9 +198,11 @@ public class I2PAppContext {
* over time. * over time.
*/ */
public StatManager statManager() { public StatManager statManager() {
if (!_statManagerInitialized) initializeStatManager(); if (!_statManagerInitialized)
initializeStatManager();
return _statManager; return _statManager;
} }
private void initializeStatManager() { private void initializeStatManager() {
synchronized (this) { synchronized (this) {
if (_statManager == null) if (_statManager == null)
@ -215,9 +221,11 @@ public class I2PAppContext {
* *
*/ */
public SessionKeyManager sessionKeyManager() { public SessionKeyManager sessionKeyManager() {
if (!_sessionKeyManagerInitialized) initializeSessionKeyManager(); if (!_sessionKeyManagerInitialized)
initializeSessionKeyManager();
return _sessionKeyManager; return _sessionKeyManager;
} }
private void initializeSessionKeyManager() { private void initializeSessionKeyManager() {
synchronized (this) { synchronized (this) {
if (_sessionKeyManager == null) if (_sessionKeyManager == null)
@ -232,9 +240,11 @@ public class I2PAppContext {
* specified to customize the naming service exposed. * specified to customize the naming service exposed.
*/ */
public NamingService namingService() { public NamingService namingService() {
if (!_namingServiceInitialized) initializeNamingService(); if (!_namingServiceInitialized)
initializeNamingService();
return _namingService; return _namingService;
} }
private void initializeNamingService() { private void initializeNamingService() {
synchronized (this) { synchronized (this) {
if (_namingService == null) { if (_namingService == null) {
@ -245,9 +255,11 @@ public class I2PAppContext {
} }
public PetNameDB petnameDb() { public PetNameDB petnameDb() {
if (!_petnameDbInitialized) initializePetnameDb(); if (!_petnameDbInitialized)
initializePetnameDb();
return _petnameDb; return _petnameDb;
} }
private void initializePetnameDb() { private void initializePetnameDb() {
synchronized (this) { synchronized (this) {
if (_petnameDb == null) { if (_petnameDb == null) {
@ -266,9 +278,11 @@ public class I2PAppContext {
* it ;) * it ;)
*/ */
public ElGamalEngine elGamalEngine() { public ElGamalEngine elGamalEngine() {
if (!_elGamalEngineInitialized) initializeElGamalEngine(); if (!_elGamalEngineInitialized)
initializeElGamalEngine();
return _elGamalEngine; return _elGamalEngine;
} }
private void initializeElGamalEngine() { private void initializeElGamalEngine() {
synchronized (this) { synchronized (this) {
if (_elGamalEngine == null) { if (_elGamalEngine == null) {
@ -289,9 +303,11 @@ public class I2PAppContext {
* *
*/ */
public ElGamalAESEngine elGamalAESEngine() { public ElGamalAESEngine elGamalAESEngine() {
if (!_elGamalAESEngineInitialized) initializeElGamalAESEngine(); if (!_elGamalAESEngineInitialized)
initializeElGamalAESEngine();
return _elGamalAESEngine; return _elGamalAESEngine;
} }
private void initializeElGamalAESEngine() { private void initializeElGamalAESEngine() {
synchronized (this) { synchronized (this) {
if (_elGamalAESEngine == null) if (_elGamalAESEngine == null)
@ -307,9 +323,11 @@ public class I2PAppContext {
* disable it. * disable it.
*/ */
public AESEngine aes() { public AESEngine aes() {
if (!_AESEngineInitialized) initializeAESEngine(); if (!_AESEngineInitialized)
initializeAESEngine();
return _AESEngine; return _AESEngine;
} }
private void initializeAESEngine() { private void initializeAESEngine() {
synchronized (this) { synchronized (this) {
if (_AESEngine == null) { if (_AESEngine == null) {
@ -329,9 +347,11 @@ public class I2PAppContext {
* their own log levels, output locations, and rotation configuration. * their own log levels, output locations, and rotation configuration.
*/ */
public LogManager logManager() { public LogManager logManager() {
if (!_logManagerInitialized) initializeLogManager(); if (!_logManagerInitialized)
initializeLogManager();
return _logManager; return _logManager;
} }
private void initializeLogManager() { private void initializeLogManager() {
synchronized (this) { synchronized (this) {
if (_logManager == null) if (_logManager == null)
@ -339,15 +359,18 @@ public class I2PAppContext {
_logManagerInitialized = true; _logManagerInitialized = true;
} }
} }
/** /**
* There is absolutely no good reason to make this context specific, * There is absolutely no good reason to make this context specific,
* other than for consistency, and perhaps later we'll want to * other than for consistency, and perhaps later we'll want to
* include some stats. * include some stats.
*/ */
public HMACGenerator hmac() { public HMACGenerator hmac() {
if (!_hmacInitialized) initializeHMAC(); if (!_hmacInitialized)
initializeHMAC();
return _hmac; return _hmac;
} }
private void initializeHMAC() { private void initializeHMAC() {
synchronized (this) { synchronized (this) {
if (_hmac == null) { if (_hmac == null) {
@ -358,9 +381,11 @@ public class I2PAppContext {
} }
public HMAC256Generator hmac256() { public HMAC256Generator hmac256() {
if (!_hmac256Initialized) initializeHMAC256(); if (!_hmac256Initialized)
initializeHMAC256();
return _hmac256; return _hmac256;
} }
private void initializeHMAC256() { private void initializeHMAC256() {
synchronized (this) { synchronized (this) {
if (_hmac256 == null) { if (_hmac256 == null) {
@ -375,9 +400,11 @@ public class I2PAppContext {
* *
*/ */
public SHA256Generator sha() { public SHA256Generator sha() {
if (!_shaInitialized) initializeSHA(); if (!_shaInitialized)
initializeSHA();
return _sha; return _sha;
} }
private void initializeSHA() { private void initializeSHA() {
synchronized (this) { synchronized (this) {
if (_sha == null) if (_sha == null)
@ -391,9 +418,11 @@ public class I2PAppContext {
* *
*/ */
public DSAEngine dsa() { public DSAEngine dsa() {
if (!_dsaInitialized) initializeDSA(); if (!_dsaInitialized)
initializeDSA();
return _dsa; return _dsa;
} }
private void initializeDSA() { private void initializeDSA() {
synchronized (this) { synchronized (this) {
if (_dsa == null) { if (_dsa == null) {
@ -411,9 +440,11 @@ public class I2PAppContext {
* the appContext, see the DSA, HMAC, and SHA comments above. * the appContext, see the DSA, HMAC, and SHA comments above.
*/ */
public KeyGenerator keyGenerator() { public KeyGenerator keyGenerator() {
if (!_keyGeneratorInitialized) initializeKeyGenerator(); if (!_keyGeneratorInitialized)
initializeKeyGenerator();
return _keyGenerator; return _keyGenerator;
} }
private void initializeKeyGenerator() { private void initializeKeyGenerator() {
synchronized (this) { synchronized (this) {
if (_keyGenerator == null) if (_keyGenerator == null)
@ -428,9 +459,11 @@ public class I2PAppContext {
* *
*/ */
public Clock clock() { // overridden in RouterContext public Clock clock() { // overridden in RouterContext
if (!_clockInitialized) initializeClock(); if (!_clockInitialized)
initializeClock();
return _clock; return _clock;
} }
protected void initializeClock() { // overridden in RouterContext protected void initializeClock() { // overridden in RouterContext
synchronized (this) { synchronized (this) {
if (_clock == null) if (_clock == null)
@ -447,9 +480,11 @@ public class I2PAppContext {
* *
*/ */
public RoutingKeyGenerator routingKeyGenerator() { public RoutingKeyGenerator routingKeyGenerator() {
if (!_routingKeyGeneratorInitialized) initializeRoutingKeyGenerator(); if (!_routingKeyGeneratorInitialized)
initializeRoutingKeyGenerator();
return _routingKeyGenerator; return _routingKeyGenerator;
} }
private void initializeRoutingKeyGenerator() { private void initializeRoutingKeyGenerator() {
synchronized (this) { synchronized (this) {
if (_routingKeyGenerator == null) if (_routingKeyGenerator == null)
@ -463,9 +498,11 @@ public class I2PAppContext {
* *
*/ */
public RandomSource random() { public RandomSource random() {
if (!_randomInitialized) initializeRandom(); if (!_randomInitialized)
initializeRandom();
return _random; return _random;
} }
private void initializeRandom() { private void initializeRandom() {
synchronized (this) { synchronized (this) {
if (_random == null) { if (_random == null) {

View File

@ -41,24 +41,34 @@ import net.i2p.util.Log;
public class ATalk implements I2PSessionListener, Runnable { public class ATalk implements I2PSessionListener, Runnable {
/** logging hook - status messages are piped to this */ /** logging hook - status messages are piped to this */
private final static Log _log = new Log(ATalk.class); private final static Log _log = new Log(ATalk.class);
/** platform independent newline */ /** platform independent newline */
private final static String NL = System.getProperty("line.separator"); private final static String NL = System.getProperty("line.separator");
/** the current session */ /** the current session */
private I2PSession _session; private I2PSession _session;
/** who am i */ /** who am i */
private Destination _myDestination; private Destination _myDestination;
/** who are you? */ /** who are you? */
private Destination _peerDestination; private Destination _peerDestination;
/** location of my secret key file */ /** location of my secret key file */
private String _myKeyFile; private String _myKeyFile;
/** location of their public key */ /** location of their public key */
private String _theirDestinationFile; private String _theirDestinationFile;
/** where the application reads input from. currently set to standard input */ /** where the application reads input from. currently set to standard input */
private BufferedReader _in; private BufferedReader _in;
/** where the application sends output to. currently set to standard output */ /** where the application sends output to. currently set to standard output */
private BufferedWriter _out; private BufferedWriter _out;
/** string that messages must begin with to be treated as files */ /** string that messages must begin with to be treated as files */
private final static String FILE_COMMAND = ".file: "; private final static String FILE_COMMAND = ".file: ";
/** the, erm, manual */ /** the, erm, manual */
private final static String MANUAL = "ATalk: Anonymous Talk, a demo program for the Invisible Internet Project SDK" private final static String MANUAL = "ATalk: Anonymous Talk, a demo program for the Invisible Internet Project SDK"
+ NL + NL
@ -84,7 +94,9 @@ public class ATalk implements I2PSessionListener, Runnable {
+ NL + NL
+ "To end the talk session, enter a period on a line by itself and hit return" + "To end the talk session, enter a period on a line by itself and hit return"
+ NL; + NL;
public final static String PROP_CONFIG_LOCATION = "configFile"; public final static String PROP_CONFIG_LOCATION = "configFile";
private static final SimpleDateFormat _fmt = new SimpleDateFormat("hh:mm:ss.SSS"); private static final SimpleDateFormat _fmt = new SimpleDateFormat("hh:mm:ss.SSS");
/** Construct the talk engine, but don't connect yet */ /** Construct the talk engine, but don't connect yet */
@ -111,11 +123,12 @@ public class ATalk implements I2PSessionListener, Runnable {
_log.warn("Unable to load up the ATalk config file " + configLocation); _log.warn("Unable to load up the ATalk config file " + configLocation);
} }
// Provide any router or client API configuration here. // Provide any router or client API configuration here.
if (!props.containsKey(I2PClient.PROP_TCP_HOST)) props.setProperty(I2PClient.PROP_TCP_HOST, "localhost"); if (!props.containsKey(I2PClient.PROP_TCP_HOST))
if (!props.containsKey(I2PClient.PROP_TCP_PORT)) props.setProperty(I2PClient.PROP_TCP_PORT, "7654"); props.setProperty(I2PClient.PROP_TCP_HOST, "localhost");
if (!props.containsKey(I2PClient.PROP_TCP_PORT))
props.setProperty(I2PClient.PROP_TCP_PORT, "7654");
if (!props.containsKey(I2PClient.PROP_RELIABILITY)) if (!props.containsKey(I2PClient.PROP_RELIABILITY))
props.setProperty(I2PClient.PROP_RELIABILITY, props.setProperty(I2PClient.PROP_RELIABILITY, I2PClient.PROP_RELIABILITY_BEST_EFFORT);
I2PClient.PROP_RELIABILITY_BEST_EFFORT);
_session = client.createSession(new FileInputStream(myFile), props); _session = client.createSession(new FileInputStream(myFile), props);
_session.setSessionListener(this); _session.setSessionListener(this);
_session.connect(); _session.connect();
@ -364,4 +377,5 @@ public class ATalk implements I2PSessionListener, Runnable {
public void reportAbuse(I2PSession session, int severity) { public void reportAbuse(I2PSession session, int severity) {
_log.debug("Abuse reported of severity " + severity); _log.debug("Abuse reported of severity " + severity);
} }
} }

View File

@ -171,18 +171,14 @@ abstract class I2PSessionImpl implements I2PSession, I2CPMessageReader.I2CPMessa
for (Iterator iter = options.keySet().iterator(); iter.hasNext();) { for (Iterator iter = options.keySet().iterator(); iter.hasNext();) {
String key = (String) iter.next(); String key = (String) iter.next();
String val = options.getProperty(key); String val = options.getProperty(key);
if (key.startsWith("java")) { if (key.startsWith("java") ||
if (_log.shouldLog(Log.DEBUG)) _log.debug("Skipping java.* property: " + key); key.startsWith("user") ||
} else if (key.startsWith("user")) { key.startsWith("os") ||
if (_log.shouldLog(Log.DEBUG)) _log.debug("Skipping user.* property: " + key); key.startsWith("sun") ||
} else if (key.startsWith("os")) { key.startsWith("file") ||
if (_log.shouldLog(Log.DEBUG)) _log.debug("Skipping os.* property: " + key); key.startsWith("line") ||
} else if (key.startsWith("sun")) { key.startsWith("wrapper")) {
if (_log.shouldLog(Log.DEBUG)) _log.debug("Skipping sun.* property: " + key); if (_log.shouldLog(Log.DEBUG)) _log.debug("Skipping property: " + key);
} else if (key.startsWith("file")) {
if (_log.shouldLog(Log.DEBUG)) _log.debug("Skipping file.* property: " + key);
} else if (key.startsWith("line")) {
if (_log.shouldLog(Log.DEBUG)) _log.debug("Skipping line.* property: " + key);
} else if ((key.length() > 255) || (val.length() > 255)) { } else if ((key.length() > 255) || (val.length() > 255)) {
if (_log.shouldLog(Log.WARN)) if (_log.shouldLog(Log.WARN))
_log.warn(getPrefix() + "Not passing on property [" _log.warn(getPrefix() + "Not passing on property ["

View File

@ -39,6 +39,8 @@ public class Certificate extends DataStructureImpl {
/** Signed with 40-byte Signature and (optional) 32-byte hash */ /** Signed with 40-byte Signature and (optional) 32-byte hash */
public final static int CERTIFICATE_TYPE_SIGNED = 3; public final static int CERTIFICATE_TYPE_SIGNED = 3;
public final static int CERTIFICATE_LENGTH_SIGNED_WITH_HASH = Signature.SIGNATURE_BYTES + Hash.HASH_LENGTH; public final static int CERTIFICATE_LENGTH_SIGNED_WITH_HASH = Signature.SIGNATURE_BYTES + Hash.HASH_LENGTH;
/** Contains multiple certs */
public final static int CERTIFICATE_TYPE_MULTIPLE = 4;
public Certificate() { public Certificate() {
_type = 0; _type = 0;

View File

@ -164,7 +164,7 @@ public class PrivateKeyFile {
} }
/** Also reads in the file to get the privKay and signingPrivKey, /** Also reads in the file to get the privKey and signingPrivKey,
* which aren't available from I2PClient. * which aren't available from I2PClient.
*/ */
public Destination createIfAbsent() throws I2PException, IOException, DataFormatException { public Destination createIfAbsent() throws I2PException, IOException, DataFormatException {

View File

@ -132,6 +132,7 @@ public class EepGet {
int numRetries = 5; int numRetries = 5;
int markSize = 1024; int markSize = 1024;
int lineLen = 40; int lineLen = 40;
int inactivityTimeout = 60*1000;
String etag = null; String etag = null;
String saveAs = null; String saveAs = null;
String url = null; String url = null;
@ -145,6 +146,9 @@ public class EepGet {
} else if (args[i].equals("-n")) { } else if (args[i].equals("-n")) {
numRetries = Integer.parseInt(args[i+1]); numRetries = Integer.parseInt(args[i+1]);
i++; i++;
} else if (args[i].equals("-t")) {
inactivityTimeout = 1000 * Integer.parseInt(args[i+1]);
i++;
} else if (args[i].equals("-e")) { } else if (args[i].equals("-e")) {
etag = "\"" + args[i+1] + "\""; etag = "\"" + args[i+1] + "\"";
i++; i++;
@ -174,7 +178,7 @@ public class EepGet {
EepGet get = new EepGet(I2PAppContext.getGlobalContext(), true, proxyHost, proxyPort, numRetries, saveAs, url, true, etag); EepGet get = new EepGet(I2PAppContext.getGlobalContext(), true, proxyHost, proxyPort, numRetries, saveAs, url, true, etag);
get.addStatusListener(get.new CLIStatusListener(markSize, lineLen)); get.addStatusListener(get.new CLIStatusListener(markSize, lineLen));
get.fetch(); get.fetch(45*1000, -1, inactivityTimeout);
} }
public static String suggestName(String url) { public static String suggestName(String url) {
@ -208,7 +212,7 @@ public class EepGet {
} }
private static void usage() { private static void usage() {
System.err.println("EepGet [-p localhost:4444] [-n #retries] [-o outputFile] [-m markSize lineLen] url"); System.err.println("EepGet [-p localhost:4444] [-n #retries] [-o outputFile] [-m markSize lineLen] [-t timeout] url");
} }
public static interface StatusListener { public static interface StatusListener {
@ -416,7 +420,7 @@ public class EepGet {
SocketTimeout timeout = null; SocketTimeout timeout = null;
if (_fetchHeaderTimeout > 0) if (_fetchHeaderTimeout > 0)
timeout = new SocketTimeout(_fetchHeaderTimeout); timeout = new SocketTimeout(_fetchHeaderTimeout);
final SocketTimeout stimeout = timeout; // ugly final SocketTimeout stimeout = timeout; // ugly - why not use sotimeout?
timeout.setTimeoutCommand(new Runnable() { timeout.setTimeoutCommand(new Runnable() {
public void run() { public void run() {
if (_log.shouldLog(Log.DEBUG)) if (_log.shouldLog(Log.DEBUG))
@ -457,7 +461,7 @@ public class EepGet {
} }
_currentAttempt++; _currentAttempt++;
if (_currentAttempt > _numRetries) if (_currentAttempt > _numRetries || !_keepFetching)
break; break;
try { try {
long delay = _context.random().nextInt(60*1000); long delay = _context.random().nextInt(60*1000);
@ -629,8 +633,6 @@ public class EepGet {
if (_log.shouldLog(Log.DEBUG)) if (_log.shouldLog(Log.DEBUG))
_log.debug("rc: " + responseCode + " for " + _actualURL); _log.debug("rc: " + responseCode + " for " + _actualURL);
if(_transferFailed)
_log.error("Already failed for " + _actualURL);
boolean rcOk = false; boolean rcOk = false;
switch (responseCode) { switch (responseCode) {
case 200: // full case 200: // full
@ -661,16 +663,24 @@ public class EepGet {
_keepFetching = false; _keepFetching = false;
_notModified = true; _notModified = true;
return; return;
case 403: // bad req
case 404: // not found case 404: // not found
case 409: // bad addr helper
case 503: // no outproxy
_keepFetching = false; _keepFetching = false;
_transferFailed = true; _transferFailed = true;
// maybe we should throw instead of return to get the return code back to the user
return; return;
case 416: // completed (or range out of reach) case 416: // completed (or range out of reach)
_bytesRemaining = 0; _bytesRemaining = 0;
_keepFetching = false; _keepFetching = false;
return; return;
case 504: // gateway timeout
// throw out of doFetch() to fetch() and try again
throw new IOException("HTTP Proxy timeout");
default: default:
rcOk = false; rcOk = false;
_keepFetching = false;
_transferFailed = true; _transferFailed = true;
} }

41
deploy.xml Normal file
View File

@ -0,0 +1,41 @@
<? xml version="1.0" encoding="UTF-8" ?>
<project basedir="." default="help" name="deploy">
<property name="deploy.google.script" value="http://ant-googlecode.googlecode.com/files/ant-googlecode-0.0.1.jar" />
<property name="dir" value="tmp-deploy" />
<property file="deploy.properties" />
<target name="help">
<echo message="Useful targets: " />
<echo message=" fetch: Fetch the files from the gatekeeper's site" />
<echo message=" deploy: Deploy the files to the remote sites(currently google code only)" />
</target>
<target name="init">
<mkdir dir="${dir}" />
</target>
<target name="fetch">
<!-- TODO: write this(using eepget?) -->
</target>
<target name="pre-deploy" depends="init">
<get src="${deploy.google.script}" dest="${dir}/ant-googlecode.jar" />
<taskdef classname="net.bluecow.googlecode.ant.GoogleCodeUploadTask" classpath="path/to/ant-googlecode.jar" name="gcupload"/>
</target>
<target name="validate-deploy">
<!-- check deploy.properties -->
<fail "Version not set" unless="app.version" />
<fail "Google: Username not set" unless="deploy.google.username" />
<fail "Google: Password not set" unless="deploy.google.password" />
<!-- TODO: check for existence of files -->
<input message="Want to continue?" validargs="y,j,n" addproperty="deploy.continue" />
<fail message="Aborted.">
<condition>
<equals arg1="${deploy.continue}" arg2="n" />
</condition>
</fail>
</target>
<target name="deploy" depends="pre-deploy,validate-deploy">
<!-- TODO: add all files -->
</target>
</project>

View File

@ -1,3 +1,34 @@
* 2008-12-01 0.6.5 released
2008-12-01 Complication
* Update versions, package release, fix typo in comment
2008-11-26 zzz
* Fix Windows UrlLauncher
2008-11-21 zzz
* Cache DNS and negative DNS for 5m (was 1m and forever)
* Delay shitlist cleaner at startup
* Strip wrapper properties from client config
* Define multiple cert type
* Prohibit negative maxSends in streaming
* HTML fixup on configtunnels.jsp
* Increase wrapper exit timeout from default 15s to 30s
2008-11-20 zzz
* I2PTunnel: Handle missing fields in edit pages better
* Move DummyNetworkDatabaseFacade to his own file
to help the build dependencies
* Drop old tcp transport and old tunnel build sources
* EepGet:
- Better handling of 504 gateway timeout
(keep going up to limit of retry count rather
than just one more partial fetch)
- Add -t cmd line option for timeout
- Better handling of 403, 409, 503 errors
- Don't keep going after unknown return code
- Don't delay before exiting after a failure
2008-11-15 zzz 2008-11-15 zzz
* Build files: * Build files:
- Don't die if depend not available - Don't die if depend not available

View File

@ -1,5 +1,5 @@
<i2p.news date="$Date: 2008-10-05 12:00:00 $"> <i2p.news date="$Date: 2008-12-01 00:00:00 $">
<i2p.release version="0.6.4" date="2008/10/05" minVersion="0.6" <i2p.release version="0.6.5" date="2008/12/01" minVersion="0.6"
/> />
<center><h2>Congratulations on getting I2P installed!</h2></center> <center><h2>Congratulations on getting I2P installed!</h2></center>
<ul> <ul>

View File

@ -4,7 +4,7 @@
<info> <info>
<appname>i2p</appname> <appname>i2p</appname>
<appversion>0.6.4</appversion> <appversion>0.6.5</appversion>
<authors> <authors>
<author name="I2P" email="http://forum.i2p2.de/"/> <author name="I2P" email="http://forum.i2p2.de/"/>
</authors> </authors>

View File

@ -27,7 +27,7 @@ clientApp.3.startOnLoad=true
# load a browser pointing at the web console whenever we start up # load a browser pointing at the web console whenever we start up
clientApp.4.main=net.i2p.apps.systray.UrlLauncher clientApp.4.main=net.i2p.apps.systray.UrlLauncher
clientApp.4.name=consoleBrowser clientApp.4.name=consoleBrowser
clientApp.4.args=http://localhost:7657/ clientApp.4.args=http://localhost:7657/index.jsp
clientApp.4.delay=5 clientApp.4.delay=5
clientApp.4.startOnLoad=true clientApp.4.startOnLoad=true

View File

@ -4,7 +4,7 @@
# #
# install_i2p_service_unix # install_i2p_service_unix
# 2004 The I2P Project # 2004 The I2P Project
# http://www.i2p.net # http://www.i2p2.de/
# This code is public domain. # This code is public domain.
# #
# author: hypercubus # author: hypercubus

View File

@ -4,7 +4,7 @@
# #
# osid # osid
# 2004 The I2P Project # 2004 The I2P Project
# http://www.i2p.net # http://www.i2p2.de/
# This code is public domain. # This code is public domain.
# #
# author: hypercubus # author: hypercubus

View File

@ -2,7 +2,7 @@
:: ::
:: postinstall.bat :: postinstall.bat
:: 2004 The I2P Project :: 2004 The I2P Project
:: http://www.i2p.net :: http://www.i2p2.de/
:: This code is public domain. :: This code is public domain.
:: ::
:: author: hypercubus :: author: hypercubus

View File

@ -4,7 +4,7 @@
# #
# postinstall # postinstall
# 2004 The I2P Project # 2004 The I2P Project
# http://www.i2p.net # http://www.i2p2.de/
# This code is public domain. # This code is public domain.
# #
# author: hypercubus # author: hypercubus

View File

@ -4,7 +4,7 @@
# #
# uninstall_i2p_service_unix # uninstall_i2p_service_unix
# 2004 The I2P Project # 2004 The I2P Project
# http://www.i2p.net # http://www.i2p2.de/
# This code is public domain. # This code is public domain.
# #
# author: hypercubus # author: hypercubus

View File

@ -60,6 +60,11 @@ wrapper.java.additional.1=-DloggerFilenameOverride=logs/log-router-@.txt
wrapper.java.additional.2=-Dorg.mortbay.http.Version.paranoid=true wrapper.java.additional.2=-Dorg.mortbay.http.Version.paranoid=true
wrapper.java.additional.3=-Dorg.mortbay.util.FileResource.checkAliases=false wrapper.java.additional.3=-Dorg.mortbay.util.FileResource.checkAliases=false
wrapper.java.additional.4=-Dorg.mortbay.xml.XmlParser.NotValidating=true wrapper.java.additional.4=-Dorg.mortbay.xml.XmlParser.NotValidating=true
# Uncomment this for better performance.
# If it doesn't work, server mode is not available in your JVM.
# This may not be required if your machine is already "server-class".
# See http://java.sun.com/j2se/1.5.0/docs/guide/vm/server-class.html
#wrapper.java.additional.5=-server
# Initial Java Heap Size (in MB) # Initial Java Heap Size (in MB)
#wrapper.java.initmemory=4 #wrapper.java.initmemory=4
@ -134,6 +139,7 @@ wrapper.restart.delay=60
wrapper.ping.interval=600 wrapper.ping.interval=600
wrapper.ping.timeout=605 wrapper.ping.timeout=605
wrapper.jvm_exit.timeout=30
# use the wrapper's internal timer thread. otherwise this would # use the wrapper's internal timer thread. otherwise this would
# force a restart of the router during daylight savings time as well # force a restart of the router during daylight savings time as well

View File

@ -1,5 +1,5 @@
<i2p.news date="$Date: 2008-10-05 12:00:00 $"> <i2p.news date="$Date: 2008-12-01 00:00:00 $">
<i2p.release version="0.6.4" date="2008/10/05" minVersion="0.6" <i2p.release version="0.6.5" date="2008/12/01" minVersion="0.6"
anonurl="http://i2p/NF2RLVUxVulR3IqK0sGJR0dHQcGXAzwa6rEO4WAWYXOHw-DoZhKnlbf1nzHXwMEJoex5nFTyiNMqxJMWlY54cvU~UenZdkyQQeUSBZXyuSweflUXFqKN-y8xIoK2w9Ylq1k8IcrAFDsITyOzjUKoOPfVq34rKNDo7fYyis4kT5bAHy~2N1EVMs34pi2RFabATIOBk38Qhab57Umpa6yEoE~rbyR~suDRvD7gjBvBiIKFqhFueXsR2uSrPB-yzwAGofTXuklofK3DdKspciclTVzqbDjsk5UXfu2nTrC1agkhLyqlOfjhyqC~t1IXm-Vs2o7911k7KKLGjB4lmH508YJ7G9fLAUyjuB-wwwhejoWqvg7oWvqo4oIok8LG6ECR71C3dzCvIjY2QcrhoaazA9G4zcGMm6NKND-H4XY6tUWhpB~5GefB3YczOqMbHq4wi0O9MzBFrOJEOs3X4hwboKWANf7DT5PZKJZ5KorQPsYRSq0E3wSOsFCSsdVCKUGsAAAA/i2p/i2pupdate.sud" anonurl="http://i2p/NF2RLVUxVulR3IqK0sGJR0dHQcGXAzwa6rEO4WAWYXOHw-DoZhKnlbf1nzHXwMEJoex5nFTyiNMqxJMWlY54cvU~UenZdkyQQeUSBZXyuSweflUXFqKN-y8xIoK2w9Ylq1k8IcrAFDsITyOzjUKoOPfVq34rKNDo7fYyis4kT5bAHy~2N1EVMs34pi2RFabATIOBk38Qhab57Umpa6yEoE~rbyR~suDRvD7gjBvBiIKFqhFueXsR2uSrPB-yzwAGofTXuklofK3DdKspciclTVzqbDjsk5UXfu2nTrC1agkhLyqlOfjhyqC~t1IXm-Vs2o7911k7KKLGjB4lmH508YJ7G9fLAUyjuB-wwwhejoWqvg7oWvqo4oIok8LG6ECR71C3dzCvIjY2QcrhoaazA9G4zcGMm6NKND-H4XY6tUWhpB~5GefB3YczOqMbHq4wi0O9MzBFrOJEOs3X4hwboKWANf7DT5PZKJZ5KorQPsYRSq0E3wSOsFCSsdVCKUGsAAAA/i2p/i2pupdate.sud"
publicurl="http://dev.i2p.net/i2p/i2pupdate.sud" publicurl="http://dev.i2p.net/i2p/i2pupdate.sud"
anonannouncement="http://i2p/NF2RLVUxVulR3IqK0sGJR0dHQcGXAzwa6rEO4WAWYXOHw-DoZhKnlbf1nzHXwMEJoex5nFTyiNMqxJMWlY54cvU~UenZdkyQQeUSBZXyuSweflUXFqKN-y8xIoK2w9Ylq1k8IcrAFDsITyOzjUKoOPfVq34rKNDo7fYyis4kT5bAHy~2N1EVMs34pi2RFabATIOBk38Qhab57Umpa6yEoE~rbyR~suDRvD7gjBvBiIKFqhFueXsR2uSrPB-yzwAGofTXuklofK3DdKspciclTVzqbDjsk5UXfu2nTrC1agkhLyqlOfjhyqC~t1IXm-Vs2o7911k7KKLGjB4lmH508YJ7G9fLAUyjuB-wwwhejoWqvg7oWvqo4oIok8LG6ECR71C3dzCvIjY2QcrhoaazA9G4zcGMm6NKND-H4XY6tUWhpB~5GefB3YczOqMbHq4wi0O9MzBFrOJEOs3X4hwboKWANf7DT5PZKJZ5KorQPsYRSq0E3wSOsFCSsdVCKUGsAAAA/pipermail/i2p/2005-September/000878.html" anonannouncement="http://i2p/NF2RLVUxVulR3IqK0sGJR0dHQcGXAzwa6rEO4WAWYXOHw-DoZhKnlbf1nzHXwMEJoex5nFTyiNMqxJMWlY54cvU~UenZdkyQQeUSBZXyuSweflUXFqKN-y8xIoK2w9Ylq1k8IcrAFDsITyOzjUKoOPfVq34rKNDo7fYyis4kT5bAHy~2N1EVMs34pi2RFabATIOBk38Qhab57Umpa6yEoE~rbyR~suDRvD7gjBvBiIKFqhFueXsR2uSrPB-yzwAGofTXuklofK3DdKspciclTVzqbDjsk5UXfu2nTrC1agkhLyqlOfjhyqC~t1IXm-Vs2o7911k7KKLGjB4lmH508YJ7G9fLAUyjuB-wwwhejoWqvg7oWvqo4oIok8LG6ECR71C3dzCvIjY2QcrhoaazA9G4zcGMm6NKND-H4XY6tUWhpB~5GefB3YczOqMbHq4wi0O9MzBFrOJEOs3X4hwboKWANf7DT5PZKJZ5KorQPsYRSq0E3wSOsFCSsdVCKUGsAAAA/pipermail/i2p/2005-September/000878.html"
@ -11,29 +11,32 @@
publiclogs="http://www.i2p.net/meeting141" /> publiclogs="http://www.i2p.net/meeting141" />
<p> <p>
&#149; &#149;
2008-10-05: <b>0.6.4 <a href="http://www.i2p2.i2p/release-0.6.4.html">Released</a></b> 2008-12-01: <b>0.6.5 <a href="http://www.i2p2.i2p/release-0.6.5.html">Released</a></b>
</p><p> </p><p>
The 0.6.4 release adds performance and stability improvements. The 0.6.5 release introduces new components,
Floodfill peers which are already connected, are preferred drops some old ones (like the old TCP transport)
for RouterInfo stores, and references to new floodfill peers and has been optimized to perform better.
obtained from ordinary peers in case of shortage. </p><p>
The BOB (Basic Open Bridge) protocol is introduced,
for use by client applications which cannot import
I2CP libraries directly. This deprecates the old
SAM protocol which was previously used in such cases.
For now however, BOB is not started automatically yet
on new installations, and SAM remains active on old installations.
</p><p>
Improved code should be better at preventing congestion
by probabalistically dropping participating traffic,
and likewise behave better when congestion occurs.
The floodfill NetDB should operate more reliably,
the streaming library should choose better message sizes,
offer a socket timeout function, and work proceeds
on the "hidden" mode of operation for I2P routers.
</p><p>
From this release onward, I2P requires Java 1.5 or higher.
If you are uncertain about your Java version, you can verify
by opening a terminal window or command prompt,
and entering the command "java -version".
If you have an older Java installed, please update it first!</p>
Preference for already connected peers is generally increased
by considering them active. Timeouts during tunnel joins
are now counted against peer profiles.
Improvements to the shutdown handler, tunnel builder,
router throttling, collection of tunnel pool statistics,
as well as router console and I2PSnark improvements
(and texts to explain reachability issues) are also included.
</p> </p>
<!--
&#149;
2007-04-10:
<a href="http://dev.i2p/pipermail/i2p/2007-April/001343.html">status notes</a>
and
<a href="http://www.i2p/meeting206">meeting log</a>
<br />
-->
</i2p.news> </i2p.news>

View File

@ -81,12 +81,15 @@ public class Router {
public final static String PROP_KEYS_FILENAME = "router.keys.location"; public final static String PROP_KEYS_FILENAME = "router.keys.location";
public final static String PROP_KEYS_FILENAME_DEFAULT = "router.keys"; public final static String PROP_KEYS_FILENAME_DEFAULT = "router.keys";
public final static String PROP_SHUTDOWN_IN_PROGRESS = "__shutdownInProgress"; public final static String PROP_SHUTDOWN_IN_PROGRESS = "__shutdownInProgress";
public final static String DNS_CACHE_TIME = "" + (5*60);
static { static {
// grumble about sun's java caching DNS entries *forever* by default // grumble about sun's java caching DNS entries *forever* by default
// so lets just keep 'em for a minute // so lets just keep 'em for a short time
System.setProperty("sun.net.inetaddr.ttl", "60"); System.setProperty("sun.net.inetaddr.ttl", DNS_CACHE_TIME);
System.setProperty("networkaddress.cache.ttl", "60"); System.setProperty("sun.net.inetaddr.negative.ttl", DNS_CACHE_TIME);
System.setProperty("networkaddress.cache.ttl", DNS_CACHE_TIME);
System.setProperty("networkaddress.cache.negative.ttl", DNS_CACHE_TIME);
// until we handle restricted routes and/or all peers support v6, try v4 first // until we handle restricted routes and/or all peers support v6, try v4 first
System.setProperty("java.net.preferIPv4Stack", "true"); System.setProperty("java.net.preferIPv4Stack", "true");
System.setProperty("http.agent", "I2P"); System.setProperty("http.agent", "I2P");

View File

@ -16,8 +16,8 @@ import net.i2p.CoreVersion;
*/ */
public class RouterVersion { public class RouterVersion {
public final static String ID = "$Revision: 1.548 $ $Date: 2008-06-07 23:00:00 $"; public final static String ID = "$Revision: 1.548 $ $Date: 2008-06-07 23:00:00 $";
public final static String VERSION = "0.6.4"; public final static String VERSION = "0.6.5";
public final static long BUILD = 11; public final static long BUILD = 0;
public static void main(String args[]) { public static void main(String args[]) {
System.out.println("I2P Router version: " + VERSION + "-" + BUILD); System.out.println("I2P Router version: " + VERSION + "-" + BUILD);
System.out.println("Router ID: " + RouterVersion.ID); System.out.println("Router ID: " + RouterVersion.ID);

View File

@ -49,6 +49,7 @@ public class Shitlist {
public final static long SHITLIST_DURATION_MAX = 60*60*1000; public final static long SHITLIST_DURATION_MAX = 60*60*1000;
public final static long SHITLIST_DURATION_PARTIAL = 20*60*1000; public final static long SHITLIST_DURATION_PARTIAL = 20*60*1000;
public final static long SHITLIST_DURATION_FOREVER = 181l*24*60*60*1000; // will get rounded down to 180d on console public final static long SHITLIST_DURATION_FOREVER = 181l*24*60*60*1000; // will get rounded down to 180d on console
public final static long SHITLIST_CLEANER_START_DELAY = SHITLIST_DURATION_PARTIAL;
public Shitlist(RouterContext context) { public Shitlist(RouterContext context) {
_context = context; _context = context;
@ -62,6 +63,7 @@ public class Shitlist {
public Cleanup(RouterContext ctx) { public Cleanup(RouterContext ctx) {
super(ctx); super(ctx);
_toUnshitlist = new ArrayList(4); _toUnshitlist = new ArrayList(4);
getTiming().setStartAfter(_context.clock().now() + SHITLIST_CLEANER_START_DELAY);
} }
public String getName() { return "Cleanup shitlist"; } public String getName() { return "Cleanup shitlist"; }
public void runJob() { public void runJob() {

View File

@ -499,7 +499,7 @@ class BuildHandler {
} }
if (response == 0 && (isInGW || isOutEnd) && if (response == 0 && (isInGW || isOutEnd) &&
Boolean.valueOf(_context.getProperty(PROP_REJECT_NONPARTICIPANT))) { Boolean.valueOf(_context.getProperty(PROP_REJECT_NONPARTICIPANT)).booleanValue()) {
response = TunnelHistory.TUNNEL_REJECT_BANDWIDTH; response = TunnelHistory.TUNNEL_REJECT_BANDWIDTH;
} }