Author: toad
Date: 2007-12-05 17:17:33 +0000 (Wed, 05 Dec 2007)
New Revision: 16332

Added:
   trunk/freenet/src/freenet/node/SeedClientPeerNode.java
Modified:
   trunk/freenet/src/freenet/node/FNPPacketMangler.java
Log:
Create and add a SeedClientPeerNode

Modified: trunk/freenet/src/freenet/node/FNPPacketMangler.java
===================================================================
--- trunk/freenet/src/freenet/node/FNPPacketMangler.java        2007-12-05 
17:03:13 UTC (rev 16331)
+++ trunk/freenet/src/freenet/node/FNPPacketMangler.java        2007-12-05 
17:17:33 UTC (rev 16332)
@@ -31,6 +31,8 @@
 import freenet.io.comm.Message;
 import freenet.io.comm.MessageCore;
 import freenet.io.comm.NotConnectedException;
+import freenet.io.comm.PeerParseException;
+import freenet.io.comm.ReferenceSignatureVerificationException;
 import freenet.io.comm.Peer.LocalAddressException;
 import freenet.support.Fields;
 import freenet.io.comm.PacketSocketHandler;
@@ -38,6 +40,7 @@
 import freenet.io.comm.PeerContext;
 import freenet.support.HexUtil;
 import freenet.support.Logger;
+import freenet.support.SimpleFieldSet;
 import freenet.support.StringArray;
 import freenet.support.TimeUtil;
 import freenet.support.WouldBlockException;
@@ -1063,6 +1066,17 @@
                byte[] hisRef = new byte[data.length -8];
                System.arraycopy(data, 8, hisRef, 0, hisRef.length);

+               // construct the peernode
+               if(unknownInitiator) {
+                       pn = getPeerNodeFromUnknownInitiator(hisRef, setupType, 
pn);
+               }
+               
+               if(pn == null) {
+                       // Reject
+                       Logger.normal(this, "Rejecting...");
+                       return;
+               }
+               
                // verify the signature
                DSASignature remoteSignature = new DSASignature(new 
NativeBigInteger(1,r), new NativeBigInteger(1,s)); 
                if(!DSA.verify(pn.peerPubKey, remoteSignature, new 
NativeBigInteger(1, SHA256.digest(assembleDHParams(nonceInitiator, 
nonceResponder, _hisExponential, _ourExponential, crypto.myIdentity, data))), 
false)) {
@@ -1106,6 +1120,45 @@
                        Logger.error(this,"Message3 Sending packet 
for"+pn.getPeer()+" took "+TimeUtil.formatTime(t2-t1, 3, true));
        }

+       private PeerNode getPeerNodeFromUnknownInitiator(byte[] hisRef, int 
setupType, PeerNode pn) {
+               if(setupType == SETUP_OPENNET_SEEDNODE) {
+                       OpennetManager om = node.getOpennet();
+                       if(om == null) {
+                               Logger.error(this, "Opennet disabled, ignoring 
seednode connect attempt");
+                               // FIXME Send some sort of explicit rejection 
message.
+                               return null;
+                       }
+                       SimpleFieldSet ref = om.validateNoderef(hisRef, 0, 
hisRef.length, null);
+                       if(ref == null) {
+                               Logger.error(this, "Invalid noderef");
+                               // FIXME Send some sort of explicit rejection 
message.
+                               return null;
+                       }
+                       PeerNode seed;
+                       try {
+                               seed = new SeedClientPeerNode(ref, node, 
crypto, node.peers, false, crypto.packetMangler);
+                       } catch (FSParseException e) {
+                               Logger.error(this, "Invalid seednode noderef: 
"+e, e);
+                               return null;
+                       } catch (PeerParseException e) {
+                               Logger.error(this, "Invalid seednode noderef: 
"+e, e);
+                               return null;
+                       } catch (ReferenceSignatureVerificationException e) {
+                               Logger.error(this, "Invalid seednode noderef: 
"+e, e);
+                               return null;
+                       }
+                       if(seed.equals(pn)) {
+                               Logger.normal(this, "Already connected to 
seednode");
+                               return pn;
+                       }
+                       node.peers.addConnectedPeer(seed);
+                       return seed;
+               } else {
+                       Logger.error(this, "Unknown setup type");
+                       return null;
+               }
+       }
+
        /*
         * Responder Method:Message4
         * Process Message4

Added: trunk/freenet/src/freenet/node/SeedClientPeerNode.java
===================================================================
--- trunk/freenet/src/freenet/node/SeedClientPeerNode.java                      
        (rev 0)
+++ trunk/freenet/src/freenet/node/SeedClientPeerNode.java      2007-12-05 
17:17:33 UTC (rev 16332)
@@ -0,0 +1,44 @@
+package freenet.node;
+
+import freenet.io.comm.PeerParseException;
+import freenet.io.comm.ReferenceSignatureVerificationException;
+import freenet.support.SimpleFieldSet;
+
+public class SeedClientPeerNode extends PeerNode {
+
+       public SeedClientPeerNode(SimpleFieldSet fs, Node node2, NodeCrypto 
crypto, PeerManager peers, boolean fromLocal, OutgoingPacketMangler mangler) 
throws FSParseException, PeerParseException, 
ReferenceSignatureVerificationException {
+               super(fs, node2, crypto, peers, fromLocal, mangler, true);
+       }
+
+       public PeerNodeStatus getStatus() {
+               return new PeerNodeStatus(this);
+       }
+
+       public boolean isOpennet() {
+               return false; // Not exactly
+       }
+
+       public boolean isSearchable() {
+               return false; // We may be connected to the same node as a seed 
and as a regular connection.
+       }
+
+       public boolean equals(Object o) {
+               // Only equal to seednode of its own type.
+               // Different to an OpennetPeerNode with the same identity!
+               if(o instanceof SeedClientPeerNode) {
+                       return super.equals(o);
+               } else return false;
+       }
+       
+       public void onSuccess(boolean insert, boolean ssk) {
+               // Ignore
+       }
+       
+       public boolean isRoutingCompatible() {
+               return false;
+       }
+
+       public boolean canAcceptAnnouncements() {
+               return true;
+       }
+}


Reply via email to