Author: zothar
Date: 2008-01-06 20:48:38 +0000 (Sun, 06 Jan 2008)
New Revision: 16948

Modified:
   trunk/freenet/src/freenet/node/PeerNode.java
Log:
Implement support (except for ARKs ATM) for differential node references for 
our peers

Modified: trunk/freenet/src/freenet/node/PeerNode.java
===================================================================
--- trunk/freenet/src/freenet/node/PeerNode.java        2008-01-06 20:14:21 UTC 
(rev 16947)
+++ trunk/freenet/src/freenet/node/PeerNode.java        2008-01-06 20:48:38 UTC 
(rev 16948)
@@ -2002,8 +2002,9 @@
        * @throws FSParseException
        */
        protected synchronized boolean innerProcessNewNoderef(SimpleFieldSet 
fs, boolean forARK, boolean forDiffNodeRef) throws FSParseException {
+               // Anything may be omitted for a differential node reference
                boolean changedAnything = false;
-               if(node.testnetEnabled != 
Fields.stringToBool(fs.get("testnet"), false)) {
+               if(!forDiffNodeRef && (node.testnetEnabled != 
Fields.stringToBool(fs.get("testnet"), false))) {
                        String err = "Preventing connection to node " + 
detectedPeer + " - peer.testnet=" + !node.testnetEnabled + '(' + 
fs.get("testnet") + ") but node.testnet=" + node.testnetEnabled;
                        Logger.error(this, err);
                        throw new FSParseException(err);
@@ -2011,7 +2012,7 @@
                String newVersion = fs.get("version");
                if(newVersion == null) {
                        // Version may be ommitted for an ARK.
-                       if(!forARK)
+                       if(!forARK && !forDiffNodeRef)
                                throw new FSParseException("No version");
                } else {
                        if(!newVersion.equals(version))
@@ -2019,7 +2020,18 @@
                        version = newVersion;
                        Version.seenVersion(newVersion);
                }
-               lastGoodVersion = fs.get("lastGoodVersion");
+               String newLastGoodVersion = fs.get("lastGoodVersion");
+               if(newLastGoodVersion == null) {
+                       if(forDiffNodeRef) {
+                               // Do nothing - lastGoodVersion not required 
for differential node references
+                       } else {
+                               String err = "Peer " + detectedPeer + " omitted 
lastGoodVersion from its node reference";
+                               Logger.error(this, err);
+                               throw new FSParseException(err);
+                       }
+               } else {
+                       lastGoodVersion = newLastGoodVersion;
+               }

                updateVersionRoutablity();

@@ -2045,9 +2057,12 @@

                Peer[] oldPeers = (Peer[]) nominalPeer.toArray(new 
Peer[nominalPeer.size()]);

+               boolean refHadPhysicalUDP = false;
+
                try {
                        String physical[] = fs.getAll("physical.udp");
                        if(physical != null) {
+                               refHadPhysicalUDP = true;
                                for(int i = 0; i < physical.length; i++) {
                                        Peer p;
                                        try {
@@ -2071,6 +2086,7 @@
                        throw new FSParseException(e1);
                }

+               if(!forDiffNodeRef || refHadPhysicalUDP) {
                if(!Arrays.equals(oldPeers, nominalPeer.toArray(new 
Peer[nominalPeer.size()]))) {
                        changedAnything = true;
                        lastAttemptedHandshakeIPUpdateTime = 0;
@@ -2084,17 +2100,26 @@

                // In future, ARKs may support automatic transition when the 
ARK key is changed.
                // So parse it anyway. If it fails, no big loss; it won't even 
log an error.
+               }

                if(logMINOR)
                        Logger.minor(this, "Parsed successfully; 
changedAnything = " + changedAnything);

                int[] newNegTypes = fs.getIntArray("auth.negTypes");
-               if(newNegTypes == null || newNegTypes.length == 0)
+
+               boolean refHadNegTypes = false;
+
+               if(newNegTypes == null || newNegTypes.length == 0) {
                        newNegTypes = new int[]{0};
+               } else {
+                       refHadNegTypes = true;
+               }
+               if(!forDiffNodeRef || refHadNegTypes) {
                if(!Arrays.equals(negTypes, newNegTypes)) {
                        changedAnything = true;
                        negTypes = newNegTypes;
                }
+               }

                if(parseARK(fs, false))
                        changedAnything = true;


Reply via email to