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) {


Reply via email to