diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelRunner.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelRunner.java index 6f906a1386a292a79e83f0ae13beeea422d6e1a3..c26eccf47bad0180ca796b4c131f515a13aacd8d 100644 --- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelRunner.java +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelRunner.java @@ -283,6 +283,7 @@ public class I2PTunnelRunner extends I2PThread implements I2PSocket.SocketErrorL //else // _log.warn("You may ignore this", ex); } finally { + _cache.release(ba); if (_log.shouldLog(Log.INFO)) { _log.info(direction + ": done forwarding between " + from + " and " + to); @@ -304,7 +305,6 @@ public class I2PTunnelRunner extends I2PThread implements I2PSocket.SocketErrorL finishLock.notifyAll(); // the main thread will close sockets etc. now } - _cache.release(ba); } } } diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/WebEditPageFormGenerator.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/WebEditPageFormGenerator.java index dd6a1db4ce28f611f283cfad7ebd9c316ce63e4c..3fcf9312d6dc7780954bd0fa46252768d1cea860 100644 --- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/WebEditPageFormGenerator.java +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/WebEditPageFormGenerator.java @@ -61,6 +61,8 @@ class WebEditPageFormGenerator { buf.append("value=\"squid.i2p\" "); buf.append("/><br />\n"); + addStreamingOptions(buf, controller); + buf.append("<hr />Note: the following options are shared across all client tunnels and"); buf.append(" HTTP proxies<br />\n"); @@ -84,6 +86,8 @@ class WebEditPageFormGenerator { buf.append("value=\"").append(controller.getTargetDestination()).append("\" "); buf.append(" /> (either the hosts.txt name or the full base64 destination)<br />\n"); + addStreamingOptions(buf, controller); + buf.append("<hr />Note: the following options are shared across all client tunnels and"); buf.append(" HTTP proxies<br />\n"); @@ -122,6 +126,8 @@ class WebEditPageFormGenerator { buf.append("<input type=\"hidden\" name=\"privKeyGenerate\" value=\"true\" />"); } + addStreamingOptions(buf, controller); + addOptions(buf, controller); buf.append("<input type=\"submit\" name=\"action\" value=\"Save\">\n"); buf.append("<input type=\"submit\" name=\"action\" value=\"Remove\">\n"); @@ -164,6 +170,8 @@ class WebEditPageFormGenerator { buf.append("<input type=\"hidden\" name=\"privKeyGenerate\" value=\"true\" />"); } + addStreamingOptions(buf, controller); + addOptions(buf, controller); buf.append("<input type=\"submit\" name=\"action\" value=\"Save\">\n"); buf.append("<input type=\"submit\" name=\"action\" value=\"Remove\">\n"); @@ -204,8 +212,9 @@ class WebEditPageFormGenerator { buf.append(" checked=\"true\" />\n<br />\n"); else buf.append(" />\n<br />\n"); + } - + /** * Generate the fields asking for what port and interface the tunnel should * listen on. @@ -243,6 +252,46 @@ class WebEditPageFormGenerator { buf.append("\"><br />\n"); } + private static void addStreamingOptions(StringBuffer buf, TunnelController controller) { + int connectDelay = 0; + int maxWindowSize = -1; + + Properties opts = getOptions(controller); + if (opts != null) { + String delay = opts.getProperty("i2p.streaming.connectDelay"); + if (delay != null) { + try { + connectDelay = Integer.parseInt(delay); + } catch (NumberFormatException nfe) { + connectDelay = 0; + } + } + String max = opts.getProperty("i2p.streaming.maxWindowSize"); + if (max != null) { + try { + maxWindowSize = Integer.parseInt(max); + } catch (NumberFormatException nfe) { + maxWindowSize = -1; + } + } + } + + buf.append("<b>Delay connection briefly? </b> "); + buf.append("<input type=\"checkbox\" name=\"connectDelay\" value=\""); + buf.append((connectDelay > 0 ? connectDelay : 1000)).append("\" "); + if (connectDelay > 0) + buf.append("checked=\"true\" "); + buf.append("/> (useful for brief request/response connections)<br />\n"); + + buf.append("<b>Communication profile:</b>"); + buf.append("<select name=\"profile\">"); + if (maxWindowSize <= 0) + buf.append("<option value=\"interactive\">Interactive</option><option value=\"bulk\" selected=\"true\">Bulk</option>"); + else + buf.append("<option value=\"interactive\" selected=\"true\">Interactive</option><option value=\"bulk\">Bulk</option>"); + buf.append("</select><br />\n"); + } + /** * Add fields for customizing the I2PSession options, including helpers for * tunnel depth and count, as well as I2CP host and port. @@ -253,8 +302,6 @@ class WebEditPageFormGenerator { private static void addOptions(StringBuffer buf, TunnelController controller) { int tunnelDepth = 2; int numTunnels = 2; - int connectDelay = 0; - int maxWindowSize = -1; Properties opts = getOptions(controller); if (opts != null) { String depth = opts.getProperty("inbound.length"); @@ -273,22 +320,6 @@ class WebEditPageFormGenerator { numTunnels = 2; } } - String delay = opts.getProperty("i2p.streaming.connectDelay"); - if (delay != null) { - try { - connectDelay = Integer.parseInt(delay); - } catch (NumberFormatException nfe) { - connectDelay = 0; - } - } - String max = opts.getProperty("i2p.streaming.maxWindowSize"); - if (max != null) { - try { - maxWindowSize = Integer.parseInt(max); - } catch (NumberFormatException nfe) { - maxWindowSize = -1; - } - } } buf.append("<b>Tunnel depth:</b> "); @@ -328,21 +359,6 @@ class WebEditPageFormGenerator { } buf.append("</select><br />\n"); - buf.append("<b>Delay connection briefly? </b> "); - buf.append("<input type=\"checkbox\" name=\"connectDelay\" value=\""); - buf.append((connectDelay > 0 ? connectDelay : 1000)).append("\" "); - if (connectDelay > 0) - buf.append("checked=\"true\" "); - buf.append("/> (useful for brief request/response connections)<br />\n"); - - buf.append("<b>Communication profile:</b>"); - buf.append("<select name=\"profile\">"); - if (maxWindowSize <= 0) - buf.append("<option value=\"interactive\">Interactive</option><option value=\"bulk\" selected=\"true\">Bulk</option>"); - else - buf.append("<option value=\"interactive\" selected=\"true\">Interactive</option><option value=\"bulk\">Bulk</option>"); - buf.append("</select><br />\n"); - buf.append("<b>I2CP host:</b> "); buf.append("<input type=\"text\" name=\"clientHost\" size=\"20\" value=\""); if ( (controller != null) && (controller.getI2CPHost() != null) ) diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/WebEditPageHelper.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/WebEditPageHelper.java index a1b829e780bd950b197166fea7fa0c568e1d89f5..3f42c682d5b91ed7958c43574c25beea06dbf11e 100644 --- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/WebEditPageHelper.java +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/WebEditPageHelper.java @@ -296,6 +296,10 @@ public class WebEditPageHelper { cOpt.setProperty("option.inbound.length", _tunnelDepth); cOpt.setProperty("option.outbound.length", _tunnelDepth); } + // these are per-proxy settings, not per-session settings, and + // as such don't need to be shared. the values are propogated + // to the current tunnel's settings via cur.setConfig above + /* if (_connectDelay) cOpt.setProperty("option.i2p.streaming.connectDelay", "1000"); else @@ -304,6 +308,7 @@ public class WebEditPageHelper { cOpt.setProperty("option.i2p.streaming.maxWindowSize", "1"); else cOpt.remove("option.i2p.streaming.maxWindowSize"); + */ if (_name != null) { cOpt.setProperty("option.inbound.nickname", _name); cOpt.setProperty("option.outbound.nickname", _name); diff --git a/build.xml b/build.xml index 6700cf019d444aead80be5ac8db81d0d5a236194..5a1370490d3c720084b981555e0c097203ad7885 100644 --- a/build.xml +++ b/build.xml @@ -193,6 +193,7 @@ <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/startRouter.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/" /> diff --git a/core/java/src/net/i2p/CoreVersion.java b/core/java/src/net/i2p/CoreVersion.java index 2932641eb129e1446f16fff2e5232caf40823894..e5ee1813df009ec21b259a8971ae47363d905054 100644 --- a/core/java/src/net/i2p/CoreVersion.java +++ b/core/java/src/net/i2p/CoreVersion.java @@ -14,8 +14,8 @@ package net.i2p; * */ public class CoreVersion { - public final static String ID = "$Revision: 1.28 $ $Date: 2005/02/17 17:57:53 $"; - public final static String VERSION = "0.5.0.1"; + public final static String ID = "$Revision: 1.29 $ $Date: 2005/02/23 00:00:52 $"; + public final static String VERSION = "0.5.0.2"; public static void main(String args[]) { System.out.println("I2P Core version: " + VERSION); diff --git a/history.txt b/history.txt index 564b1d6539817db40f8f43bff916f4ce52b275c3..31aa298a5d2c667b472acde153f1792f5b755142 100644 --- a/history.txt +++ b/history.txt @@ -1,11 +1,22 @@ -$Id: history.txt,v 1.163 2005/03/04 01:09:51 jrandom Exp $ +$Id: history.txt,v 1.164 2005/03/04 21:54:42 jrandom Exp $ + +* 2005-03-06 0.5.0.2 released + +2005-03-06 jrandom + * Allow the I2PTunnel web interface to select streaming lib options for + individual client tunnels, rather than sharing them across all of them, + as we do with the session options. This way people can (and should) set + the irc proxy to interactive and the eepproxy to bulk. + * Added a startRouter.sh script to new installs which simply calls + "sh i2prouter start". This should make it clear how people should start + I2P. 2005-03-04 jrandom * Filter HTTP response headers in the eepproxy, forcing Connection: close so that broken (/malicious) webservers can't allow persistent connections. All HTTP compliant browsers should now always close the socket. - * Enabled the GZIPInputStream's cache (they were'nt cached before) + * Enabled the GZIPInputStream's cache (they weren't cached before) * Make sure our first send is always a SYN (duh) * Workaround for some buggy compilers diff --git a/installer/resources/postinstall.bat b/installer/resources/postinstall.bat index 0b896025c6a765a6f1c1d436adba4459b96425e3..d1ce099df14c385dc1e4753aba5fb8e9acf3afdd 100644 --- a/installer/resources/postinstall.bat +++ b/installer/resources/postinstall.bat @@ -30,6 +30,7 @@ del /f /q "%INSTALL_PATH%i2prouter" del /f /q "%INSTALL_PATH%install-headless.txt" del /f /q "%INSTALL_PATH%osid" del /f /q "%INSTALL_PATH%postinstall.sh" +del /f /q "%INSTALL_PATH%startRouter.sh" :: del /f /q "%INSTALL_PATH%uninstall_i2p_service_unix" del /f /q "%INSTALL_PATH%icons\*.xpm" rmdir /q /s "%INSTALL_PATH%lib\wrapper" @@ -43,6 +44,7 @@ del "%INSTALL_PATH%install_i2p_service_winnt.bat" del "%INSTALL_PATH%install-headless.txt" del "%INSTALL_PATH%osid" del "%INSTALL_PATH%postinstall.sh" +del "%INSTALL_PATH%startRouter.sh" :: del "%INSTALL_PATH%uninstall_i2p_service_unix" del "%INSTALL_PATH%uninstall_i2p_service_winnt.bat" del "%INSTALL_PATH%icons\*.xpm" diff --git a/installer/resources/postinstall.sh b/installer/resources/postinstall.sh index 2bb32b23022ace6d5a375cab3cf3ad6118c71248..35ff2fd6e546d1a4df5dfce683e5a925e3a3c2f9 100644 --- a/installer/resources/postinstall.sh +++ b/installer/resources/postinstall.sh @@ -19,6 +19,7 @@ fi chmod 744 ./i2prouter # chmod 744 ./install_i2p_service_unix chmod 744 ./osid +chmod 744 ./startRouter.sh # chmod 744 ./uninstall_i2p_service_unix ERROR_MSG="Cannot determine operating system type. From the subdirectory in lib/wrapper matching your operating system, please move i2psvc to your base I2P directory, and move the remaining two files to the lib directory." diff --git a/installer/resources/startRouter.sh b/installer/resources/startRouter.sh new file mode 100644 index 0000000000000000000000000000000000000000..f5de1d125a17b4e1a1cf299225bc4c96434c34dc --- /dev/null +++ b/installer/resources/startRouter.sh @@ -0,0 +1,2 @@ +# overly redundant, yet perhaps helpful for new users +sh i2prouter start \ No newline at end of file diff --git a/router/java/src/net/i2p/router/MessageValidator.java b/router/java/src/net/i2p/router/MessageValidator.java index 18713f9469034c46711681b79f43997f58393b57..e12417c2d85813480c016c009ee81dbf2a8ecba9 100644 --- a/router/java/src/net/i2p/router/MessageValidator.java +++ b/router/java/src/net/i2p/router/MessageValidator.java @@ -23,6 +23,8 @@ public class MessageValidator { _context = context; context.statManager().createRateStat("router.duplicateMessageId", "Note that a duplicate messageId was received", "Router", new long[] { 10*60*1000l, 60*60*1000l, 3*60*60*1000l, 24*60*60*1000l }); + context.statManager().createRateStat("router.invalidMessageTime", "Note that a message outside the valid range was received", "Router", + new long[] { 10*60*1000l, 60*60*1000l, 3*60*60*1000l, 24*60*60*1000l }); } @@ -36,10 +38,12 @@ public class MessageValidator { if (now - Router.CLOCK_FUDGE_FACTOR >= expiration) { if (_log.shouldLog(Log.WARN)) _log.warn("Rejecting message " + messageId + " because it expired " + (now-expiration) + "ms ago"); + _context.statManager().addRateData("router.invalidMessageTime", (now-expiration), 0); return false; } else if (now + 4*Router.CLOCK_FUDGE_FACTOR < expiration) { if (_log.shouldLog(Log.WARN)) _log.warn("Rejecting message " + messageId + " because it will expire too far in the future (" + (expiration-now) + "ms)"); + _context.statManager().addRateData("router.invalidMessageTime", (now-expiration), 0); return false; } diff --git a/router/java/src/net/i2p/router/RouterVersion.java b/router/java/src/net/i2p/router/RouterVersion.java index 87ab848e7b61525b1ec05560eec5c225d0a00a31..c5d8294a5a05e0e8467049a60444b53763342f94 100644 --- a/router/java/src/net/i2p/router/RouterVersion.java +++ b/router/java/src/net/i2p/router/RouterVersion.java @@ -15,9 +15,9 @@ import net.i2p.CoreVersion; * */ public class RouterVersion { - public final static String ID = "$Revision: 1.158 $ $Date: 2005/03/04 01:09:20 $"; - public final static String VERSION = "0.5.0.1"; - public final static long BUILD = 10; + public final static String ID = "$Revision: 1.159 $ $Date: 2005/03/04 21:54:43 $"; + public final static String VERSION = "0.5.0.2"; + public final static long BUILD = 0; public static void main(String args[]) { System.out.println("I2P Router version: " + VERSION); System.out.println("Router ID: " + RouterVersion.ID); diff --git a/router/java/src/net/i2p/router/StatisticsManager.java b/router/java/src/net/i2p/router/StatisticsManager.java index e439d4abf7f80ed2d3ed3365cfb24c34e5b8a48e..d3e8bb73ba641920c5ba535800b9c57484894300 100644 --- a/router/java/src/net/i2p/router/StatisticsManager.java +++ b/router/java/src/net/i2p/router/StatisticsManager.java @@ -33,7 +33,7 @@ public class StatisticsManager implements Service { public final static String PROP_PUBLISH_RANKINGS = "router.publishPeerRankings"; public final static String DEFAULT_PROP_PUBLISH_RANKINGS = "true"; public final static String PROP_MAX_PUBLISHED_PEERS = "router.publishPeerMax"; - public final static int DEFAULT_MAX_PUBLISHED_PEERS = 20; + public final static int DEFAULT_MAX_PUBLISHED_PEERS = 10; private final DecimalFormat _fmt; private final DecimalFormat _pct; @@ -102,6 +102,7 @@ public class StatisticsManager implements Service { stats.putAll(_context.profileManager().summarizePeers(_publishedStats)); includeThroughput(stats); + includeRate("router.invalidMessageTime", stats, new long[] { 10*60*1000, 3*60*60*1000 }); includeRate("router.duplicateMessageId", stats, new long[] { 24*60*60*1000 }); includeRate("tunnel.duplicateIV", stats, new long[] { 24*60*60*1000 }); includeRate("tunnel.fragmentedComplete", stats, new long[] { 10*60*1000, 3*60*60*1000 });