Author: nextgens
Date: 2008-06-21 14:04:42 +0000 (Sat, 21 Jun 2008)
New Revision: 20567
Modified:
trunk/freenet/src/freenet/clients/http/SimpleToadletServer.java
trunk/freenet/src/freenet/clients/http/StartupToadlet.java
trunk/freenet/src/freenet/crypt/Yarrow.java
trunk/freenet/src/freenet/node/Node.java
trunk/freenet/src/freenet/node/NodeStarter.java
Log:
untested implementation of bug #229: More entropy issues
*TESTING IS REQUIRED*
Modified: trunk/freenet/src/freenet/clients/http/SimpleToadletServer.java
===================================================================
--- trunk/freenet/src/freenet/clients/http/SimpleToadletServer.java
2008-06-21 13:33:00 UTC (rev 20566)
+++ trunk/freenet/src/freenet/clients/http/SimpleToadletServer.java
2008-06-21 14:04:42 UTC (rev 20567)
@@ -465,10 +465,12 @@
}
- private StartupToadlet startupToadlet;
+ public StartupToadlet startupToadlet;
public void removeStartupToadlet() {
unregister(startupToadlet);
+ // Ready to be GCed
+ startupToadlet = null;
// Not in the navbar.
}
@@ -520,6 +522,10 @@
}
}
+ public StartupToadlet getStartupToadlet() {
+ return startupToadlet;
+ }
+
public Toadlet findToadlet(URI uri) throws PermanentRedirectException {
Iterator i = toadlets.iterator();
String path = uri.getPath();
Modified: trunk/freenet/src/freenet/clients/http/StartupToadlet.java
===================================================================
--- trunk/freenet/src/freenet/clients/http/StartupToadlet.java 2008-06-21
13:33:00 UTC (rev 20566)
+++ trunk/freenet/src/freenet/clients/http/StartupToadlet.java 2008-06-21
14:04:42 UTC (rev 20567)
@@ -9,9 +9,10 @@
/**
* Toadlet for "Freenet is starting up" page.
*/
-class StartupToadlet extends Toadlet {
+public class StartupToadlet extends Toadlet {
private StaticToadlet staticToadlet;
+ private volatile boolean isPRNGReady = false;
public StartupToadlet(StaticToadlet staticToadlet) {
super(null);
@@ -31,12 +32,19 @@
HTMLNode headNode = ctx.getPageMaker().getHeadNode(pageNode);
headNode.addChild("meta", new String[]{"http-equiv", "content"},
new String[]{"refresh", "20; url="});
HTMLNode contentNode = ctx.getPageMaker().getContentNode(pageNode);
+
+ if(!isPRNGReady) {
+ HTMLNode prngInfobox =
contentNode.addChild(ctx.getPageMaker().getInfobox("infobox-error", desc));
+ HTMLNode prngInfoboxContent =
ctx.getPageMaker().getContentNode(prngInfobox);
+ prngInfoboxContent.addChild("#", "There isn't enough
entropy available on your system... Freenet won't start until it can gather
enough.");
+ }
HTMLNode infobox =
contentNode.addChild(ctx.getPageMaker().getInfobox("infobox-error", desc));
HTMLNode infoboxContent = ctx.getPageMaker().getContentNode(infobox);
infoboxContent.addChild("#", "Your freenet node is starting up, please
hold on.");
WelcomeToadlet.maybeDisplayWrapperLogfile(ctx, contentNode);
+
//TODO: send a Retry-After header ?
writeHTMLReply(ctx, 503, desc, pageNode.generate());
}
@@ -45,4 +53,8 @@
public String supportedMethods() {
return "GET";
}
+
+ public void setIsPRNGReady() {
+ isPRNGReady = true;
+ }
}
\ No newline at end of file
Modified: trunk/freenet/src/freenet/crypt/Yarrow.java
===================================================================
--- trunk/freenet/src/freenet/crypt/Yarrow.java 2008-06-21 13:33:00 UTC (rev
20566)
+++ trunk/freenet/src/freenet/crypt/Yarrow.java 2008-06-21 14:04:42 UTC (rev
20567)
@@ -85,7 +85,7 @@
throw new RuntimeException("Cannot initialize Yarrow!: "+e, e);
}
entropy_init(seed);
- seedFromExternalStuff(false);
+ seedFromExternalStuff(true);
if (updateSeed && !(seed.toString()).equals("/dev/urandom"))
//Dont try to update the seedfile if we know that it wont be possible anyways
seedfile = seed;
else
Modified: trunk/freenet/src/freenet/node/Node.java
===================================================================
--- trunk/freenet/src/freenet/node/Node.java 2008-06-21 13:33:00 UTC (rev
20566)
+++ trunk/freenet/src/freenet/node/Node.java 2008-06-21 14:04:42 UTC (rev
20567)
@@ -33,6 +33,7 @@
import freenet.client.FetchContext;
import freenet.clients.http.SimpleToadletServer;
+import freenet.clients.http.StartupToadlet;
import freenet.config.EnumerableOptionCallback;
import freenet.config.FreenetFilePersistentConfig;
import freenet.config.InvalidConfigValueException;
@@ -40,6 +41,7 @@
import freenet.config.PersistentConfig;
import freenet.config.SubConfig;
import freenet.crypt.DSAPublicKey;
+import freenet.crypt.DiffieHellman;
import freenet.crypt.RandomSource;
import freenet.crypt.SHA256;
import freenet.crypt.Yarrow;
@@ -118,6 +120,7 @@
import freenet.support.io.FileUtil;
import freenet.support.io.NativeThread;
import freenet.support.transport.ip.HostnameSyntaxException;
+import java.net.URI;
/**
* @author amphibian
@@ -604,11 +607,11 @@
* @param config The Config object for this node.
* @param random The random number generator for this node. Passed in
because we may want
* to use a non-secure RNG for e.g. one-JVM live-code simulations.
Should be a Yarrow in
- * a production node.
+ * a production node. Yarrow will be used if that parameter is null
* @param the loggingHandler
* @throws NodeInitException If the node initialization fails.
*/
- Node(PersistentConfig config, RandomSource random,
LoggingConfigHandler lc, NodeStarter ns, Executor executor) throws
NodeInitException {
+ Node(PersistentConfig config, RandomSource r, LoggingConfigHandler lc,
NodeStarter ns, Executor executor) throws NodeInitException {
// Easy stuff
logMINOR = Logger.shouldLog(Logger.MINOR, this);
String tmp = "Initializing Node using Freenet Build
#"+Version.buildNumber()+" r"+Version.cvsRevision+" and freenet-ext Build
#"+NodeStarter.extBuildNumber+" r"+NodeStarter.extRevisionNumber+" with
"+System.getProperty("java.vendor")+" JVM version
"+System.getProperty("java.version")+" running on
"+System.getProperty("os.arch")+' '+System.getProperty("os.name")+'
'+System.getProperty("os.version");
@@ -629,7 +632,6 @@
// FProxy config needs to be here too
SubConfig fproxyConfig = new SubConfig("fproxy", config);
-
try {
toadlets = new SimpleToadletServer(fproxyConfig, new
ArrayBucketFactory(), executor);
fproxyConfig.finishedInitialization();
@@ -644,14 +646,18 @@
e4.printStackTrace();
throw new
NodeInitException(NodeInitException.EXIT_COULD_NOT_START_FPROXY, "Could not
start FProxy: "+e4);
}
-
+
+ // Setup RNG if needed : DO NOT USE IT BEFORE THAT POINT!
+ this.random = (r == null ? new Yarrow() : r);
+ DiffieHellman.init(random);
+ byte buffer[] = new byte[16];
+ random.nextBytes(buffer);
+ this.fastWeakRandom = new MersenneTwister(buffer);
+ toadlets.getStartupToadlet().setIsPRNGReady();
+
nodeNameUserAlert = new MeaningfulNodeNameUserAlert(this);
recentlyCompletedIDs = new LRUQueue();
this.config = config;
- this.random = random;
- byte buffer[] = new byte[16];
- random.nextBytes(buffer);
- this.fastWeakRandom = new MersenneTwister(buffer);
cachedPubKeys = new LRUHashtable();
lm = new LocationManager(random, this);
Modified: trunk/freenet/src/freenet/node/NodeStarter.java
===================================================================
--- trunk/freenet/src/freenet/node/NodeStarter.java 2008-06-21 13:33:00 UTC
(rev 20566)
+++ trunk/freenet/src/freenet/node/NodeStarter.java 2008-06-21 14:04:42 UTC
(rev 20567)
@@ -113,11 +113,6 @@
// Prevent timeouts for a while. The DiffieHellman init for
example could take some time on a very slow system.
WrapperManager.signalStarting(500000);
- // Setup RNG
- RandomSource random = new Yarrow();
-
- DiffieHellman.init(random);
-
// Thread to keep the node up.
// JVM deadlocks losing a lock when two threads of different
types (daemon|app)
// are contended for the same lock. So make USM daemon, and use
useless to keep the JVM
@@ -154,7 +149,7 @@
SSL.init(sslConfig);
try {
- node = new Node(cfg, random, logConfigHandler, this,
executor);
+ node = new Node(cfg, null, logConfigHandler, this,
executor);
node.start(false);
System.out.println("Node initialization completed.");
} catch(NodeInitException e) {