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;
+ }
+}