Author: toad
Date: 2007-06-28 20:57:14 +0000 (Thu, 28 Jun 2007)
New Revision: 13816
Added:
trunk/freenet/src/freenet/node/NodeCrypto.java
trunk/freenet/src/freenet/node/NodeInitException.java
Modified:
trunk/freenet/src/freenet/clients/http/DarknetConnectionsToadlet.java
trunk/freenet/src/freenet/crypt/SHA256.java
trunk/freenet/src/freenet/io/comm/UdpSocketHandler.java
trunk/freenet/src/freenet/node/CHKInsertSender.java
trunk/freenet/src/freenet/node/ConfigurablePersister.java
trunk/freenet/src/freenet/node/DNSRequester.java
trunk/freenet/src/freenet/node/DarknetPeerNode.java
trunk/freenet/src/freenet/node/FNPPacketMangler.java
trunk/freenet/src/freenet/node/IPDetectorPluginManager.java
trunk/freenet/src/freenet/node/LocationManager.java
trunk/freenet/src/freenet/node/Node.java
trunk/freenet/src/freenet/node/NodeARKInserter.java
trunk/freenet/src/freenet/node/NodeClientCore.java
trunk/freenet/src/freenet/node/NodeDispatcher.java
trunk/freenet/src/freenet/node/NodeIPDetector.java
trunk/freenet/src/freenet/node/NodeStarter.java
trunk/freenet/src/freenet/node/NodeStats.java
trunk/freenet/src/freenet/node/PacketSender.java
trunk/freenet/src/freenet/node/PeerManager.java
trunk/freenet/src/freenet/node/PeerNode.java
trunk/freenet/src/freenet/node/SSKInsertSender.java
trunk/freenet/src/freenet/node/TestnetHandler.java
trunk/freenet/src/freenet/node/TextModeClientInterface.java
trunk/freenet/src/freenet/node/fcp/AddPeer.java
trunk/freenet/src/freenet/node/simulator/RealNodePingTest.java
trunk/freenet/src/freenet/node/simulator/RealNodeRequestInsertTest.java
trunk/freenet/src/freenet/node/simulator/RealNodeRoutingTest.java
trunk/freenet/src/freenet/node/updater/NodeUpdateManager.java
trunk/freenet/src/freenet/store/BerkeleyDBFreenetStore.java
Log:
Lots more refactoring: Move all node crypto and communication etc stuff to
NodeCrypto class.
Modified: trunk/freenet/src/freenet/clients/http/DarknetConnectionsToadlet.java
===================================================================
--- trunk/freenet/src/freenet/clients/http/DarknetConnectionsToadlet.java
2007-06-28 19:15:14 UTC (rev 13815)
+++ trunk/freenet/src/freenet/clients/http/DarknetConnectionsToadlet.java
2007-06-28 20:57:14 UTC (rev 13816)
@@ -6,6 +6,7 @@
import java.net.URI;
import java.net.URL;
import java.net.URLConnection;
+import java.util.Arrays;
import java.util.HashMap;
import freenet.client.HighLevelSimpleClient;
@@ -122,7 +123,7 @@
}
DarknetPeerNode pn;
try {
- pn = new DarknetPeerNode(fs, node, node.peers,
false, node.darknetPacketMangler);
+ pn = node.createNewDarknetNode(fs);
pn.setPrivateDarknetCommentNote(privateComment);
} catch (FSParseException e1) {
this.sendErrorPage(ctx, 200,
l10n("failedToAddNodeTitle"),
@@ -142,7 +143,7 @@
this.sendErrorPage(ctx,
l10n("failedToAddNodeInternalErrorTitle"),
l10n("failedToAddNodeInternalError"), t);
return;
}
- if(pn.getIdentityHash()==node.getIdentityHash()) {
+ if(Arrays.equals(pn.getIdentity(),
node.getDarknetIdentity())) {
this.sendErrorPage(ctx, 200,
l10n("failedToAddNodeTitle"), l10n("triedToAddSelf"));
return;
}
Modified: trunk/freenet/src/freenet/crypt/SHA256.java
===================================================================
--- trunk/freenet/src/freenet/crypt/SHA256.java 2007-06-28 19:15:14 UTC (rev
13815)
+++ trunk/freenet/src/freenet/crypt/SHA256.java 2007-06-28 20:57:14 UTC (rev
13816)
@@ -48,6 +48,7 @@
import org.tanukisoftware.wrapper.WrapperManager;
import freenet.node.Node;
+import freenet.node.NodeInitException;
import freenet.support.HexUtil;
import freenet.support.Logger;
@@ -372,7 +373,7 @@
System.err.println("Check your JVM settings especially the
JCE!"+e2);
e2.printStackTrace();
}
- WrapperManager.stop(Node.EXIT_CRAPPY_JVM);
+ WrapperManager.stop(NodeInitException.EXIT_CRAPPY_JVM);
throw new RuntimeException();
}
Modified: trunk/freenet/src/freenet/io/comm/UdpSocketHandler.java
===================================================================
--- trunk/freenet/src/freenet/io/comm/UdpSocketHandler.java 2007-06-28
19:15:14 UTC (rev 13815)
+++ trunk/freenet/src/freenet/io/comm/UdpSocketHandler.java 2007-06-28
20:57:14 UTC (rev 13816)
@@ -14,6 +14,7 @@
import freenet.io.comm.Peer.LocalAddressException;
import freenet.node.LoggingConfigHandler;
import freenet.node.Node;
+import freenet.node.NodeInitException;
import freenet.support.FileLoggerHook;
import freenet.support.Logger;
import freenet.support.OOMHandler;
@@ -319,7 +320,7 @@
} else {
Logger.error(this, "MAIN LOOP
TERMINATED");
System.err.println("MAIN LOOP
TERMINATED!");
- node.exit(Node.EXIT_MAIN_LOOP_LOST);
+
node.exit(NodeInitException.EXIT_MAIN_LOOP_LOST);
}
}
}
Modified: trunk/freenet/src/freenet/node/CHKInsertSender.java
===================================================================
--- trunk/freenet/src/freenet/node/CHKInsertSender.java 2007-06-28 19:15:14 UTC
(rev 13815)
+++ trunk/freenet/src/freenet/node/CHKInsertSender.java 2007-06-28 20:57:14 UTC
(rev 13816)
@@ -137,7 +137,7 @@
}
void start() {
- Thread t = new Thread(this, "CHKInsertSender for UID "+uid+" on
"+node.darknetPortNumber+" at "+System.currentTimeMillis());
+ Thread t = new Thread(this, "CHKInsertSender for UID "+uid+" on
"+node.getDarknetPortNumber()+" at "+System.currentTimeMillis());
t.setDaemon(true);
t.start();
}
Modified: trunk/freenet/src/freenet/node/ConfigurablePersister.java
===================================================================
--- trunk/freenet/src/freenet/node/ConfigurablePersister.java 2007-06-28
19:15:14 UTC (rev 13815)
+++ trunk/freenet/src/freenet/node/ConfigurablePersister.java 2007-06-28
20:57:14 UTC (rev 13816)
@@ -6,7 +6,6 @@
import freenet.config.InvalidConfigValueException;
import freenet.config.SubConfig;
import freenet.l10n.L10n;
-import freenet.node.Node.NodeInitException;
import freenet.support.api.StringCallback;
public class ConfigurablePersister extends Persister {
@@ -30,7 +29,7 @@
try {
setThrottles(throttleFile);
} catch (InvalidConfigValueException e2) {
- throw new
NodeInitException(Node.EXIT_THROTTLE_FILE_ERROR, e2.getMessage());
+ throw new
NodeInitException(NodeInitException.EXIT_THROTTLE_FILE_ERROR, e2.getMessage());
}
}
Modified: trunk/freenet/src/freenet/node/DNSRequester.java
===================================================================
--- trunk/freenet/src/freenet/node/DNSRequester.java 2007-06-28 19:15:14 UTC
(rev 13815)
+++ trunk/freenet/src/freenet/node/DNSRequester.java 2007-06-28 20:57:14 UTC
(rev 13816)
@@ -19,7 +19,7 @@
DNSRequester(Node node) {
this.node = node;
- myThread = new Thread(this, "DNSRequester thread for
"+node.darknetPortNumber);
+ myThread = new Thread(this, "DNSRequester thread for
"+node.getDarknetPortNumber());
myThread.setDaemon(true);
}
Modified: trunk/freenet/src/freenet/node/DarknetPeerNode.java
===================================================================
--- trunk/freenet/src/freenet/node/DarknetPeerNode.java 2007-06-28 19:15:14 UTC
(rev 13815)
+++ trunk/freenet/src/freenet/node/DarknetPeerNode.java 2007-06-28 20:57:14 UTC
(rev 13816)
@@ -94,8 +94,8 @@
* @param fs The SimpleFieldSet to parse
* @param node2 The running Node we are part of.
*/
- public DarknetPeerNode(SimpleFieldSet fs, Node node2, PeerManager peers,
boolean fromLocal, OutgoingPacketMangler mangler) throws FSParseException,
PeerParseException, ReferenceSignatureVerificationException {
- super(fs, node2, peers, fromLocal, mangler);
+ public DarknetPeerNode(SimpleFieldSet fs, Node node2, NodeCrypto crypto,
PeerManager peers, boolean fromLocal, OutgoingPacketMangler mangler) throws
FSParseException, PeerParseException, ReferenceSignatureVerificationException {
+ super(fs, node2, crypto, peers, fromLocal, mangler);
logMINOR = Logger.shouldLog(Logger.MINOR, this);
Modified: trunk/freenet/src/freenet/node/FNPPacketMangler.java
===================================================================
--- trunk/freenet/src/freenet/node/FNPPacketMangler.java 2007-06-28
19:15:14 UTC (rev 13815)
+++ trunk/freenet/src/freenet/node/FNPPacketMangler.java 2007-06-28
20:57:14 UTC (rev 13816)
@@ -37,6 +37,7 @@
private static boolean logMINOR;
final Node node;
+ final NodeCrypto crypto;
final MessageCore usm;
final PacketSocketHandler sock;
final EntropySource fnpTimingSource;
@@ -67,8 +68,9 @@
final int fullHeadersLengthMinimum;
final int fullHeadersLengthOneMessage;
- public FNPPacketMangler(Node node, PacketSocketHandler sock) {
+ public FNPPacketMangler(Node node, NodeCrypto crypt, PacketSocketHandler
sock) {
this.node = node;
+ this.crypto = crypt;
this.usm = node.usm;
this.sock = sock;
fnpTimingSource = new EntropySource();
@@ -345,7 +347,7 @@
md.update(data);
byte[] hash = md.digest();
- DSASignature sig = node.sign(hash);
+ DSASignature sig = crypto.sign(hash);
byte[] r = sig.getRBytes(Node.SIGNATURE_PARAMETER_LENGTH);
byte[] s = sig.getSBytes(Node.SIGNATURE_PARAMETER_LENGTH);
Modified: trunk/freenet/src/freenet/node/IPDetectorPluginManager.java
===================================================================
--- trunk/freenet/src/freenet/node/IPDetectorPluginManager.java 2007-06-28
19:15:14 UTC (rev 13815)
+++ trunk/freenet/src/freenet/node/IPDetectorPluginManager.java 2007-06-28
20:57:14 UTC (rev 13816)
@@ -45,7 +45,7 @@
div.addChild("#", text);
if(suggestPortForward) {
L10n.addL10nSubstitution(div,
"IPDetectorPluginManager.suggestForwardPortWithLink", new String[] { "link",
"/link", "port" },
- new String[] { "<a
href=\"/?_CHECKED_HTTP_=http://wiki.freenetproject.org/FirewallAndRouterIssues\">",
"</a>", Integer.toString(node.darknetPortNumber) });
+ new String[] { "<a
href=\"/?_CHECKED_HTTP_=http://wiki.freenetproject.org/FirewallAndRouterIssues\">",
"</a>", Integer.toString(node.getDarknetPortNumber()) });
}
return div;
}
@@ -58,7 +58,7 @@
if(!suggestPortForward) return text;
StringBuffer sb = new StringBuffer();
sb.append(text);
- sb.append(l10n("suggestForwardPort", "port",
Integer.toString(node.darknetPortNumber)));
+ sb.append(l10n("suggestForwardPort", "port",
Integer.toString(node.getDarknetPortNumber())));
return sb.toString();
}
Modified: trunk/freenet/src/freenet/node/LocationManager.java
===================================================================
--- trunk/freenet/src/freenet/node/LocationManager.java 2007-06-28 19:15:14 UTC
(rev 13815)
+++ trunk/freenet/src/freenet/node/LocationManager.java 2007-06-28 20:57:14 UTC
(rev 13816)
@@ -197,7 +197,7 @@
*/
private void startSwapRequest() {
Thread t = new Thread(new OutgoingSwapRequestHandler(),
- "Outgoing swap request handler for port
"+node.darknetPortNumber);
+ "Outgoing swap request handler for port
"+node.getDarknetPortNumber());
t.setDaemon(true);
t.start();
}
@@ -569,7 +569,7 @@
if(logMINOR) Logger.minor(this, "Already locked");
return false;
}
- if(logMINOR) Logger.minor(this, "Locking on port
"+node.darknetPortNumber);
+ if(logMINOR) Logger.minor(this, "Locking on port
"+node.getDarknetPortNumber());
locked = true;
lockedTime = System.currentTimeMillis();
return true;
@@ -581,7 +581,7 @@
locked = false;
long lockTime = System.currentTimeMillis() - lockedTime;
if(logMINOR) {
- Logger.minor(this, "Unlocking on port "+node.darknetPortNumber);
+ Logger.minor(this, "Unlocking on port
"+node.getDarknetPortNumber());
Logger.minor(this, "lockTime: "+lockTime);
}
}
@@ -762,7 +762,7 @@
IncomingSwapRequestHandler isrh =
new IncomingSwapRequestHandler(m, pn, item);
if(logMINOR) Logger.minor(this, "Handling... "+uid);
- Thread t = new Thread(isrh, "Incoming swap request handler for
port "+node.darknetPortNumber);
+ Thread t = new Thread(isrh, "Incoming swap request handler for
port "+node.getDarknetPortNumber());
t.setDaemon(true);
t.start();
return true;
Modified: trunk/freenet/src/freenet/node/Node.java
===================================================================
--- trunk/freenet/src/freenet/node/Node.java 2007-06-28 19:15:14 UTC (rev
13815)
+++ trunk/freenet/src/freenet/node/Node.java 2007-06-28 20:57:14 UTC (rev
13816)
@@ -16,10 +16,7 @@
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
-import java.io.UnsupportedEncodingException;
-import java.math.BigInteger;
import java.net.InetAddress;
-import java.net.MalformedURLException;
import java.net.UnknownHostException;
import java.security.MessageDigest;
import java.util.Arrays;
@@ -31,8 +28,6 @@
import java.util.Random;
import java.util.zip.DeflaterOutputStream;
-import net.i2p.util.NativeBigInteger;
-
import org.spaceroots.mantissa.random.MersenneTwister;
import org.tanukisoftware.wrapper.WrapperManager;
@@ -50,12 +45,8 @@
import freenet.config.LongOption;
import freenet.config.PersistentConfig;
import freenet.config.SubConfig;
-import freenet.crypt.DSA;
-import freenet.crypt.DSAGroup;
-import freenet.crypt.DSAPrivateKey;
import freenet.crypt.DSAPublicKey;
import freenet.crypt.DSASignature;
-import freenet.crypt.Global;
import freenet.crypt.RandomSource;
import freenet.crypt.SHA256;
import freenet.io.comm.DMT;
@@ -67,7 +58,6 @@
import freenet.io.comm.Peer;
import freenet.io.comm.PeerParseException;
import freenet.io.comm.ReferenceSignatureVerificationException;
-import freenet.io.comm.UdpSocketHandler;
import freenet.io.xfer.PartiallyReceivedBlock;
import freenet.keys.CHKBlock;
import freenet.keys.CHKVerifyException;
@@ -77,8 +67,6 @@
import freenet.keys.ClientKeyBlock;
import freenet.keys.ClientSSK;
import freenet.keys.ClientSSKBlock;
-import freenet.keys.FreenetURI;
-import freenet.keys.InsertableClientSSK;
import freenet.keys.Key;
import freenet.keys.KeyBlock;
import freenet.keys.KeyVerifyException;
@@ -97,14 +85,12 @@
import freenet.store.BerkeleyDBFreenetStore;
import freenet.store.FreenetStore;
import freenet.store.KeyCollisionException;
-import freenet.support.Base64;
import freenet.support.DoubleTokenBucket;
import freenet.support.Fields;
import freenet.support.FileLoggerHook;
import freenet.support.HTMLEncoder;
import freenet.support.HTMLNode;
import freenet.support.HexUtil;
-import freenet.support.IllegalBase64Exception;
import freenet.support.ImmutableByteArrayWrapper;
import freenet.support.LRUHashtable;
import freenet.support.LRUQueue;
@@ -124,28 +110,6 @@
private static boolean logMINOR;
- static class NodeBindtoCallback implements StringCallback {
-
- final Node node;
-
- NodeBindtoCallback(Node n) {
- this.node = n;
- }
-
- public String get() {
- if(node.getBindTo()!=null)
- return node.getBindTo();
- else
- return "0.0.0.0";
- }
-
- public void set(String val) throws InvalidConfigValueException {
- if(val.equals(get())) return;
- // FIXME why not? Can't we use
freenet.io.NetworkInterface like everywhere else, just adapt it for UDP?
- throw new InvalidConfigValueException("Cannot be
updated on the fly");
- }
- }
-
private static MeaningfulNodeNameUserAlert nodeNameUserAlert;
private static BuildOldAgeUserAlert buildOldAgeUserAlert;
private static TimeSkewDetectedUserAlert timeSkewDetectedUserAlert;
@@ -330,11 +294,6 @@
private final HashSet runningCHKPutUIDs;
private final HashSet runningSSKPutUIDs;
- byte[] myIdentity; // FIXME: simple identity block; should be unique
- /** Hash of identity. Used as setup key. */
- byte[] identityHash;
- /** Hash of hash of identity i.e. hash of setup key. */
- byte[] identityHashHash;
/** Semi-unique ID for swap requests. Used to identify us so that the
* topology can be reconstructed. */
public long swapIdentifier;
@@ -361,22 +320,12 @@
// Darknet stuff
- /** The object which handles our specific UDP port, pulls messages from
it, feeds them to the packet mangler for decryption etc */
- final UdpSocketHandler darknetSocket;
- public final FNPPacketMangler darknetPacketMangler;
- // FIXME: abstract out address stuff? Possibly to something like
NodeReference?
- final int darknetPortNumber;
- /** My crypto group */
- private DSAGroup darknetCryptoGroup;
- /** My private key */
- private DSAPrivateKey darknetPrivKey;
- /** My public key */
- private DSAPublicKey darknetPubKey;
- /** My ARK SSK private key */
- InsertableClientSSK darknetARK;
- /** My ARK sequence number */
- long darknetARKNumber;
+ private NodeCrypto darknetCrypto;
+ // Opennet stuff
+
+ private NodeCrypto opennetCrypto;
+
// General stuff
public final PacketSender ps;
@@ -394,35 +343,6 @@
public static final short DEFAULT_MAX_HTL = (short)10;
public static final int DEFAULT_SWAP_INTERVAL = 2000;
private short maxHTL;
- public static final int EXIT_STORE_FILE_NOT_FOUND = 1;
- public static final int EXIT_STORE_IOEXCEPTION = 2;
- public static final int EXIT_STORE_OTHER = 3;
- public static final int EXIT_STORE_RECONSTRUCT = 27;
- public static final int EXIT_USM_DIED = 4;
- public static final int EXIT_YARROW_INIT_FAILED = 5;
- public static final int EXIT_TEMP_INIT_ERROR = 6;
- public static final int EXIT_TESTNET_FAILED = 7;
- public static final int EXIT_MAIN_LOOP_LOST = 8;
- public static final int EXIT_COULD_NOT_BIND_USM = 9;
- public static final int EXIT_IMPOSSIBLE_USM_PORT = 10;
- public static final int EXIT_NO_AVAILABLE_UDP_PORTS = 11;
- public static final int EXIT_TESTNET_DISABLED_NOT_SUPPORTED = 12;
- public static final int EXIT_INVALID_STORE_SIZE = 13;
- public static final int EXIT_BAD_DOWNLOADS_DIR = 14;
- public static final int EXIT_BAD_NODE_DIR = 15;
- public static final int EXIT_BAD_TEMP_DIR = 16;
- public static final int EXIT_COULD_NOT_START_FCP = 17;
- public static final int EXIT_COULD_NOT_START_FPROXY = 18;
- public static final int EXIT_COULD_NOT_START_TMCI = 19;
- public static final int EXIT_CRAPPY_JVM = 255;
- public static final int EXIT_DATABASE_REQUIRES_RESTART = 20;
- public static final int EXIT_COULD_NOT_START_UPDATER = 21;
- public static final int EXIT_EXTRA_PEER_DATA_DIR = 22;
- public static final int EXIT_THROTTLE_FILE_ERROR = 23;
- public static final int EXIT_RESTART_FAILED = 24;
- public static final int EXIT_TEST_ERROR = 25;
- public static final int EXIT_BAD_BWLIMIT = 26;
-
/** Type identifier for fproxy node to node messages, as sent on
DMT.nodeToNodeMessage's */
public static final int N2N_MESSAGE_TYPE_FPROXY = 1;
/** Identifier within fproxy messages for simple, short text messages
to be displayed on the homepage as useralerts */
@@ -442,7 +362,6 @@
public final long startupTime;
public final NodeClientCore clientCore;
- final String bindto;
// The version we were before we restarted.
public int lastVersion;
@@ -494,24 +413,17 @@
e1.initCause(e);
throw e1;
}
- if(p.getPort() == darknetPortNumber) {
+ if(p.getPort() == getDarknetPortNumber()) {
// DNSRequester doesn't deal with our
own node
ipDetector.setOldIPAddress(p.getFreenetAddress());
break;
}
}
}
- String identity = fs.get("identity");
- if(identity == null)
- throw new IOException();
- try {
- myIdentity = Base64.decode(identity);
- } catch (IllegalBase64Exception e2) {
- throw new IOException();
- }
- identityHash = SHA256.digest(myIdentity);
- identityHashHash = SHA256.digest(identityHash);
- swapIdentifier = Fields.bytesToLong(identityHashHash);
+
+ darknetCrypto.readCrypto(fs);
+
+ swapIdentifier =
Fields.bytesToLong(darknetCrypto.identityHashHash);
String loc = fs.get("location");
Location l;
try {
@@ -534,58 +446,7 @@
} else {
lastVersion =
Version.getArbitraryBuildNumber(verString);
}
-
- // FIXME: Back compatibility; REMOVE !!
- try {
- this.darknetCryptoGroup =
DSAGroup.create(fs.subset("dsaGroup"));
- this.darknetPrivKey =
DSAPrivateKey.create(fs.subset("dsaPrivKey"), darknetCryptoGroup);
- this.darknetPubKey =
DSAPublicKey.create(fs.subset("dsaPubKey"), darknetCryptoGroup);
- } catch (NullPointerException e) {
- if(logMINOR) Logger.minor(this, "Caught "+e, e);
- this.darknetCryptoGroup = Global.DSAgroupBigA;
- this.darknetPrivKey = new
DSAPrivateKey(darknetCryptoGroup, r);
- this.darknetPubKey = new
DSAPublicKey(darknetCryptoGroup, darknetPrivKey);
- } catch (IllegalBase64Exception e) {
- if(logMINOR) Logger.minor(this, "Caught "+e, e);
- this.darknetCryptoGroup = Global.DSAgroupBigA;
- this.darknetPrivKey = new
DSAPrivateKey(darknetCryptoGroup, r);
- this.darknetPubKey = new
DSAPublicKey(darknetCryptoGroup, darknetPrivKey);
- }
- InsertableClientSSK ark = null;
- // ARK
-
- String s = fs.get("ark.number");
-
- String privARK = fs.get("ark.privURI");
- try {
- if(privARK != null) {
- FreenetURI uri = new FreenetURI(privARK);
- ark = InsertableClientSSK.create(uri);
- if(ark.isInsecure() || s == null) {
- if(ark.isInsecure())
- System.out.println("Creating
new ARK, old is insecure");
- ark = null;
- darknetARKNumber = 0;
- } else {
- try {
- darknetARKNumber =
Long.parseLong(s);
- } catch (NumberFormatException e) {
- darknetARKNumber = 0;
- ark = null;
- }
- }
- }
- } catch (MalformedURLException e) {
- Logger.minor(this, "Caught "+e, e);
- ark = null;
- }
- if(ark == null) {
- ark = InsertableClientSSK.createRandom(r, "ark");
- darknetARKNumber = 0;
- }
- this.darknetARK = ark;
-
wasTestnet = Fields.stringToBool(fs.get("testnet"), false);
}
@@ -594,7 +455,7 @@
}
public void writeNodeFile() {
- writeNodeFile(new File(nodeDir, "node-"+darknetPortNumber), new
File(nodeDir, "node-"+darknetPortNumber+".bak"));
+ writeNodeFile(new File(nodeDir,
"node-"+getDarknetPortNumber()), new File(nodeDir,
"node-"+getDarknetPortNumber()+".bak"));
}
private void writeNodeFile(File orig, File backup) {
@@ -628,21 +489,11 @@
private void initNodeFileSettings(RandomSource r) {
Logger.normal(this, "Creating new node file from scratch");
- // Don't need to set darknetPortNumber
+ // Don't need to set getDarknetPortNumber()
// FIXME use a real IP!
- myIdentity = new byte[32];
- r.nextBytes(myIdentity);
- MessageDigest md = SHA256.getMessageDigest();
- identityHash = md.digest(myIdentity);
- identityHashHash = md.digest(identityHash);
- swapIdentifier = Fields.bytesToLong(identityHashHash);
+ darknetCrypto.initCrypto();
+ swapIdentifier =
Fields.bytesToLong(darknetCrypto.identityHashHash);
myName = newName();
- this.darknetCryptoGroup = Global.DSAgroupBigA;
- this.darknetPrivKey = new DSAPrivateKey(darknetCryptoGroup, r);
- this.darknetPubKey = new DSAPublicKey(darknetCryptoGroup,
darknetPrivKey);
- darknetARK = InsertableClientSSK.createRandom(r, "ark");
- darknetARKNumber = 0;
- SHA256.returnMessageDigest(md);
}
/**
@@ -654,17 +505,6 @@
NodeStarter.main(args);
}
- public static class NodeInitException extends Exception {
- // One of the exit codes from above
- public final int exitCode;
- private static final long serialVersionUID = -1;
-
- NodeInitException(int exitCode, String msg) {
- super(msg+" ("+exitCode+ ')');
- this.exitCode = exitCode;
- }
- }
-
public boolean isUsingWrapper(){
if(nodeStarter!=null &&
WrapperManager.isControlledByNativeWrapper())
return true;
@@ -765,92 +605,17 @@
decrementAtMin = random.nextDouble() <= DECREMENT_AT_MIN_PROB;
// FIXME maybe these configs should actually be under a node.ip
subconfig?
- ipDetector = new NodeIPDetector(this);
+ ipDetector = new NodeIPDetector(this, darknetCrypto);
sortOrder = ipDetector.registerConfigs(nodeConfig, sortOrder);
// Determine where to bind to
- nodeConfig.register("bindTo", "0.0.0.0", sortOrder++, true,
true, "Node.bindTo", "Node.bindToLong", new NodeBindtoCallback(this));
+ usm = new MessageCore();
- this.bindto = nodeConfig.getString("bindTo");
-
// Determine the port number
- nodeConfig.register("listenPort", -1 /* means random */,
sortOrder++, true, true, "Node.port", "Node.portLong", new IntCallback() {
- public int get() {
- return darknetPortNumber;
- }
- public void set(int val) throws
InvalidConfigValueException {
- // FIXME implement on the fly
listenPort changing
- // Note that this sort of thing
should be the exception rather than the rule!!!!
- String msg = "Switching
listenPort on the fly not yet supported!";
- Logger.error(this, msg);
- throw new
InvalidConfigValueException(msg);
- }
- });
+ darknetCrypto = new NodeCrypto(nodeConfig, sortOrder++, this);
- int port=-1;
- try{
- port=nodeConfig.getInt("listenPort");
- }catch (Exception e){
- Logger.error(this, "Caught "+e, e);
- System.err.println(e);
- e.printStackTrace();
- port=-1;
- }
-
- usm = new MessageCore();
-
- UdpSocketHandler u = null;
-
- if(port > 65535) {
- throw new NodeInitException(EXIT_IMPOSSIBLE_USM_PORT,
"Impossible port number: "+port);
- } else if(port == -1) {
- // Pick a random port
- for(int i=0;i<200000;i++) {
- int portNo = 1024 + random.nextInt(65535-1024);
- try {
- u = new UdpSocketHandler(portNo,
InetAddress.getByName(bindto), this);
- port = u.getPortNumber();
- break;
- } catch (Exception e) {
- Logger.normal(this, "Could not use
port: "+bindto+ ':' +portNo+": "+e, e);
- System.err.println("Could not use port:
"+bindto+ ':' +portNo+": "+e);
- e.printStackTrace();
- continue;
- }
- }
- if(u == null)
- throw new
NodeInitException(EXIT_NO_AVAILABLE_UDP_PORTS, "Could not find an available UDP
port number for FNP (none specified)");
- } else {
- try {
- u = new UdpSocketHandler(port,
InetAddress.getByName(bindto), this);
- } catch (Exception e) {
- throw new
NodeInitException(EXIT_IMPOSSIBLE_USM_PORT, "Could not bind to port: "+port+"
(node already running?)");
- }
- }
- darknetSocket = u;
-
- Logger.normal(this, "FNP port created on "+bindto+ ':' +port);
- System.out.println("FNP port created on "+bindto+ ':' +port);
- darknetPortNumber = port;
-
- nodeConfig.register("testingDropPacketsEvery", 0, sortOrder++,
true, false, "Node.dropPacketEvery", "Node.dropPacketEveryLong",
- new IntCallback() {
-
- public int get() {
- return
((UdpSocketHandler)darknetSocket).getDropProbability();
- }
-
- public void set(int val) throws
InvalidConfigValueException {
-
((UdpSocketHandler)darknetSocket).setDropProbability(val);
- }
-
- });
-
- int dropProb = nodeConfig.getInt("testingDropPacketsEvery");
- ((UdpSocketHandler)darknetSocket).setDropProbability(dropProb);
-
Logger.normal(Node.class, "Creating node...");
// Bandwidth limit
@@ -872,7 +637,7 @@
int obwLimit = nodeConfig.getInt("outputBandwidthLimit");
if(obwLimit <= 0)
- throw new NodeInitException(EXIT_BAD_BWLIMIT, "Invalid
outputBandwidthLimit");
+ throw new
NodeInitException(NodeInitException.EXIT_BAD_BWLIMIT, "Invalid
outputBandwidthLimit");
outputBandwidthLimit = obwLimit;
outputThrottle = new DoubleTokenBucket(obwLimit/2,
(1000L*1000L*1000L) / obwLimit, obwLimit, (obwLimit * 2) / 5);
@@ -898,7 +663,7 @@
int ibwLimit = nodeConfig.getInt("inputBandwidthLimit");
if(obwLimit <= 0)
- throw new NodeInitException(EXIT_BAD_BWLIMIT, "Invalid
inputBandwidthLimit");
+ throw new
NodeInitException(NodeInitException.EXIT_BAD_BWLIMIT, "Invalid
inputBandwidthLimit");
inputBandwidthLimit = ibwLimit;
if(ibwLimit == -1) {
inputLimitDefault = true;
@@ -977,16 +742,16 @@
nodeDir = new File(nodeConfig.getString("nodeDir"));
if(!((nodeDir.exists() && nodeDir.isDirectory()) ||
(nodeDir.mkdir()))) {
String msg = "Could not find or create datastore
directory";
- throw new NodeInitException(EXIT_BAD_NODE_DIR, msg);
+ throw new
NodeInitException(NodeInitException.EXIT_BAD_NODE_DIR, msg);
}
// After we have set up testnet and IP address, load the node
file
try {
// FIXME should take file directly?
- readNodeFile(new File(nodeDir,
"node-"+darknetPortNumber).getPath(), random);
+ readNodeFile(new File(nodeDir,
"node-"+getDarknetPortNumber()).getPath(), random);
} catch (IOException e) {
try {
- readNodeFile(new
File("node-"+darknetPortNumber+".bak").getPath(), random);
+ readNodeFile(new
File("node-"+getDarknetPortNumber()+".bak").getPath(), random);
} catch (IOException e1) {
initNodeFileSettings(random);
}
@@ -994,21 +759,19 @@
if(wasTestnet != testnetEnabled) {
Logger.error(this, "Switched from testnet mode to
non-testnet mode or vice versa! Regenerating pubkey, privkey, and deleting
logs.");
- this.darknetCryptoGroup = Global.DSAgroupBigA;
- this.darknetPrivKey = new
DSAPrivateKey(darknetCryptoGroup, random);
- this.darknetPubKey = new
DSAPublicKey(darknetCryptoGroup, darknetPrivKey);
+ // FIXME do we delete logs?
+ darknetCrypto.initCrypto();
}
usm.setDispatcher(dispatcher=new NodeDispatcher(this));
- darknetSocket.setLowLevelFilter(darknetPacketMangler = new
FNPPacketMangler(this, darknetSocket));
// Then read the peers
- peers = new PeerManager(this, new File(nodeDir,
"peers-"+darknetPortNumber).getPath(), darknetPacketMangler);
+ peers = new PeerManager(this, darknetCrypto, new File(nodeDir,
"peers-"+getDarknetPortNumber()).getPath(), darknetCrypto.packetMangler);
peers.writePeers();
peers.updatePMUserAlert();
// Extra Peer Data Directory
- nodeConfig.register("extraPeerDataDir", new File(nodeDir,
"extra-peer-data-"+darknetPortNumber).toString(), sortOrder++, true, false,
"Node.extraPeerDir", "Node.extraPeerDirLong",
+ nodeConfig.register("extraPeerDataDir", new File(nodeDir,
"extra-peer-data-"+getDarknetPortNumber()).toString(), sortOrder++, true,
false, "Node.extraPeerDir", "Node.extraPeerDirLong",
new StringCallback() {
public String get() {
return
extraPeerDataDir.getPath();
@@ -1022,7 +785,7 @@
extraPeerDataDir = new
File(nodeConfig.getString("extraPeerDataDir"));
if(!((extraPeerDataDir.exists() &&
extraPeerDataDir.isDirectory()) || (extraPeerDataDir.mkdir()))) {
String msg = "Could not find or create extra peer data
directory";
- throw new NodeInitException(EXIT_EXTRA_PEER_DATA_DIR,
msg);
+ throw new
NodeInitException(NodeInitException.EXIT_EXTRA_PEER_DATA_DIR, msg);
}
// Name
@@ -1091,7 +854,7 @@
maxTotalDatastoreSize = nodeConfig.getLong("storeSize");
if(maxTotalDatastoreSize < 0 || maxTotalDatastoreSize < (32 *
1024 * 1024)) { // totally arbitrary minimum!
- throw new NodeInitException(EXIT_INVALID_STORE_SIZE,
"Invalid store size");
+ throw new
NodeInitException(NodeInitException.EXIT_INVALID_STORE_SIZE, "Invalid store
size");
}
maxTotalKeys = maxTotalDatastoreSize / sizePerKey;
@@ -1111,7 +874,7 @@
storeDir = new File(nodeConfig.getString("storeDir"));
if(!((storeDir.exists() && storeDir.isDirectory()) ||
(storeDir.mkdir()))) {
String msg = "Could not find or create datastore
directory";
- throw new NodeInitException(EXIT_STORE_OTHER, msg);
+ throw new
NodeInitException(NodeInitException.EXIT_STORE_OTHER, msg);
}
maxStoreKeys = maxTotalKeys / 2;
@@ -1133,7 +896,7 @@
envConfig.setLockTimeout(600*1000*1000); // should be long
enough even for severely overloaded nodes!
// Note that the above is in *MICRO*seconds.
- File dbDir = new File(storeDir, "database-"+darknetPortNumber);
+ File dbDir = new File(storeDir,
"database-"+getDarknetPortNumber());
dbDir.mkdirs();
File reconstructFile = new File(dbDir, "reconstruct");
@@ -1143,7 +906,7 @@
boolean tryDbLoad = false;
- String suffix = "-" + darknetPortNumber;
+ String suffix = "-" + getDarknetPortNumber();
// This can take some time
System.out.println("Starting database...");
@@ -1236,7 +999,7 @@
e1.printStackTrace();
System.err.println("Previous error was (tried
deleting database and retrying): "+e);
e.printStackTrace();
- throw new NodeInitException(EXIT_STORE_OTHER,
e1.getMessage());
+ throw new
NodeInitException(NodeInitException.EXIT_STORE_OTHER, e1.getMessage());
}
}
storeEnvironment = env;
@@ -1301,7 +1064,7 @@
} catch (DatabaseException e) {
System.err.println("Could not set the database
configuration: "+e);
e.printStackTrace();
- throw new NodeInitException(EXIT_STORE_OTHER,
e.getMessage());
+ throw new
NodeInitException(NodeInitException.EXIT_STORE_OTHER, e.getMessage());
}
try {
@@ -1334,13 +1097,13 @@
String msg = "Could not open datastore: "+e1;
Logger.error(this, msg, e1);
System.err.println(msg);
- throw new NodeInitException(EXIT_STORE_FILE_NOT_FOUND,
msg);
+ throw new
NodeInitException(NodeInitException.EXIT_STORE_FILE_NOT_FOUND, msg);
} catch (IOException e1) {
String msg = "Could not open datastore: "+e1;
Logger.error(this, msg, e1);
System.err.println(msg);
e1.printStackTrace();
- throw new NodeInitException(EXIT_STORE_IOEXCEPTION,
msg);
+ throw new
NodeInitException(NodeInitException.EXIT_STORE_IOEXCEPTION, msg);
} catch (DatabaseException e1) {
try {
reconstructFile.createNewFile();
@@ -1352,7 +1115,7 @@
Logger.error(this, msg, e1);
System.err.println(msg);
e1.printStackTrace();
- throw new NodeInitException(EXIT_STORE_RECONSTRUCT,
msg);
+ throw new
NodeInitException(NodeInitException.EXIT_STORE_RECONSTRUCT, msg);
}
// FIXME back compatibility
@@ -1373,7 +1136,7 @@
nodeStats = new NodeStats(this, sortOrder, new
SubConfig("node.load", config), oldThrottleFS, obwLimit, ibwLimit);
- clientCore = new NodeClientCore(this, config, nodeConfig,
nodeDir, darknetPortNumber, sortOrder, oldThrottleFS == null ? null :
oldThrottleFS.subset("RequestStarters"));
+ clientCore = new NodeClientCore(this, config, nodeConfig,
nodeDir, getDarknetPortNumber(), sortOrder, oldThrottleFS == null ? null :
oldThrottleFS.subset("RequestStarters"));
nodeConfig.register("disableHangCheckers", false, sortOrder++,
true, false, "Node.disableHangCheckers", "Node.disableHangCheckersLong", new
BooleanCallback() {
@@ -1433,7 +1196,7 @@
nodeUpdater = NodeUpdateManager.maybeCreate(this,
config);
} catch (InvalidConfigValueException e) {
e.printStackTrace();
- throw new
NodeInitException(EXIT_COULD_NOT_START_UPDATER, "Could not create Updater: "+e);
+ throw new
NodeInitException(NodeInitException.EXIT_COULD_NOT_START_UPDATER, "Could not
create Updater: "+e);
}
Logger.normal(this, "Node constructor completed");
@@ -1451,7 +1214,7 @@
nodeStats.start();
usm.start(ps);
- ((UdpSocketHandler)darknetSocket).start(disableHangCheckers);
+ darknetCrypto.start(disableHangCheckers);
if(isUsingWrapper()) {
Logger.normal(this, "Using wrapper correctly:
"+nodeStarter);
@@ -1462,8 +1225,8 @@
}
Logger.normal(this, "Freenet 0.7 Build
#"+Version.buildNumber()+" r"+Version.cvsRevision);
System.out.println("Freenet 0.7 Build
#"+Version.buildNumber()+" r"+Version.cvsRevision);
- Logger.normal(this, "FNP port is on "+bindto+ ':'
+darknetPortNumber);
- System.out.println("FNP port is on "+bindto+ ':'
+darknetPortNumber);
+ Logger.normal(this, "FNP port is on "+darknetCrypto.bindto+ ':'
+getDarknetPortNumber());
+ System.out.println("FNP port is on "+darknetCrypto.bindto+ ':'
+getDarknetPortNumber());
// Start services
// SubConfig pluginManagerConfig = new SubConfig("pluginmanager3",
config);
@@ -1477,7 +1240,7 @@
nodeUpdater.start();
}catch (Exception e) {
e.printStackTrace();
- throw new
NodeInitException(EXIT_COULD_NOT_START_UPDATER, "Could not start Updater: "+e);
+ throw new
NodeInitException(NodeInitException.EXIT_COULD_NOT_START_UPDATER, "Could not
start Updater: "+e);
}
// Start testnet handler
@@ -1694,8 +1457,7 @@
public SimpleFieldSet exportPrivateFieldSet() {
SimpleFieldSet fs = exportPublicFieldSet(false);
- fs.put("dsaPrivKey", darknetPrivKey.asFieldSet());
- fs.putSingle("ark.privURI",
this.darknetARK.getInsertURI().toString(false, false));
+ darknetCrypto.addPrivateFields(fs);
return fs;
}
@@ -1715,7 +1477,7 @@
* or that can safely be exchanged later.
*/
SimpleFieldSet exportPublicFieldSet(boolean forSetup) {
- SimpleFieldSet fs = new SimpleFieldSet(true);
+ SimpleFieldSet fs =
darknetCrypto.exportPublicFieldSet(forSetup);
// IP addresses
Peer[] ips = ipDetector.getPrimaryIPAddress();
if(ips != null) {
@@ -1723,9 +1485,6 @@
fs.putAppend("physical.udp",
ips[i].toString()); // Keep; important that node know all our IPs
}
// Negotiation types
- int[] negTypes = darknetPacketMangler.supportedNegTypes();
- fs.put("auth.negTypes", negTypes);
- fs.putSingle("identity", Base64.encode(myIdentity)); // FIXME
!forSetup after 11104 is mandatory
fs.put("location", lm.getLocation().getValue()); // FIXME maybe
!forSetup; see #943
fs.putSingle("version", Version.getVersionString()); // Keep,
vital that peer know our version. For example, some types may be sent in
different formats to different node versions (e.g. Peer).
fs.put("testnet", testnetEnabled); // Vital that peer know this!
@@ -1733,33 +1492,14 @@
if(testnetEnabled)
fs.put("testnetPort", testnetHandler.getPort()); //
Useful, saves a lot of complexity
fs.putSingle("myName", myName); // FIXME see #942
- if(!forSetup) {
- // These are invariant. They cannot change on
connection setup. They can safely be excluded.
- fs.put("dsaGroup", darknetCryptoGroup.asFieldSet());
- fs.put("dsaPubKey", darknetPubKey.asFieldSet());
- }
- fs.put("ark.number", darknetARKNumber); // Can be changed on
setup
- fs.putSingle("ark.pubURI",
this.darknetARK.getURI().toString(false, false)); // Can be changed on setup
synchronized (referenceSync) {
if(myReferenceSignature == null || mySignedReference ==
null || !mySignedReference.equals(fs.toOrderedString())){
mySignedReference = fs.toOrderedString();
- if(logMINOR) Logger.minor(this, "Signing
reference:\n"+mySignedReference);
-
- try{
- byte[] ref =
mySignedReference.getBytes("UTF-8");
- BigInteger m = new BigInteger(1,
SHA256.digest(ref));
- if(logMINOR) Logger.minor(this, "m =
"+m.toString(16));
- myReferenceSignature =
DSA.sign(darknetCryptoGroup, darknetPrivKey, m, random);
- // FIXME remove this ... eventually
- if(!DSA.verify(darknetPubKey,
myReferenceSignature, m, false))
- Logger.error(this, "Signature
failed!");
- } catch(UnsupportedEncodingException e){
- //duh ?
- Logger.error(this, "Error while signing
the node identity!"+e);
- System.err.println("Error while signing
the node identity!"+e);
- e.printStackTrace();
- exit(EXIT_CRAPPY_JVM);
+ try {
+ myReferenceSignature =
darknetCrypto.signRef(mySignedReference);
+ } catch (NodeInitException e) {
+ exit(e.exitCode);
}
}
fs.putSingle("sig",
myReferenceSignature.toLongString());
@@ -1818,7 +1558,7 @@
*/
public Object makeRequestSender(Key key, short htl, long uid, PeerNode
source, double closestLocation, boolean resetClosestLocation, boolean
localOnly, boolean cache, boolean ignoreStore) {
logMINOR = Logger.shouldLog(Logger.MINOR, this);
- if(logMINOR) Logger.minor(this, "makeRequestSender("+key+ ','
+htl+ ',' +uid+ ',' +source+") on "+darknetPortNumber);
+ if(logMINOR) Logger.minor(this, "makeRequestSender("+key+ ','
+htl+ ',' +uid+ ',' +source+") on "+getDarknetPortNumber());
// In store?
KeyBlock chk = null;
if(!ignoreStore) {
@@ -2573,18 +2313,10 @@
ipDetector.onConnectedPeer();
}
- public String getBindTo(){
- return this.bindto;
- }
-
public int getFNPPort(){
- return this.darknetPortNumber;
+ return this.getDarknetPortNumber();
}
- public int getIdentityHash(){
- return Fields.hashCode(identityHash);
- }
-
public synchronized boolean setNewestPeerLastGoodVersion( int version )
{
if( version > buildOldAgeUserAlert.lastGoodVersion ) {
if( buildOldAgeUserAlert.lastGoodVersion == 0 ) {
@@ -2815,14 +2547,6 @@
config.get("node").getOption("name").setValue(key);
}
- protected DSAPrivateKey getDarknetPrivKey() {
- return darknetPrivKey;
- }
-
- protected DSAPublicKey getDarknetPubKey() {
- return darknetPubKey;
- }
-
public Ticker getTicker() {
return ps;
}
@@ -2835,7 +2559,7 @@
* Connect this node to another node (for purposes of testing)
*/
public void connect(Node node) throws FSParseException,
PeerParseException, ReferenceSignatureVerificationException {
- peers.connect(node.exportPublicFieldSet(),
darknetPacketMangler);
+ peers.connect(node.exportPublicFieldSet(),
darknetCrypto.packetMangler);
}
public short maxHTL() {
@@ -2843,7 +2567,7 @@
}
public int getDarknetPortNumber() {
- return darknetPortNumber;
+ return darknetCrypto.portNumber;
}
public void JEStatsDump() {
@@ -2865,11 +2589,6 @@
return inputBandwidthLimit;
}
- /** Sign a hash */
- DSASignature sign(byte[] hash) {
- return DSA.sign(darknetCryptoGroup, darknetPrivKey, new
NativeBigInteger(1, hash), random);
- }
-
public synchronized void setTimeSkewDetectedUserAlert() {
if(timeSkewDetectedUserAlert == null) {
timeSkewDetectedUserAlert = new
TimeSkewDetectedUserAlert();
@@ -2880,4 +2599,16 @@
public File getNodeDir() {
return nodeDir;
}
+
+ public DarknetPeerNode createNewDarknetNode(SimpleFieldSet fs) throws
FSParseException, PeerParseException, ReferenceSignatureVerificationException {
+ return new DarknetPeerNode(fs, this, darknetCrypto, peers, false,
darknetCrypto.packetMangler);
+ }
+
+ public byte[] getDarknetIdentity() {
+ return darknetCrypto.myIdentity;
+ }
+
+ public int estimateFullHeadersLengthOneMessage() {
+ return
darknetCrypto.packetMangler.fullHeadersLengthOneMessage();
+ }
}
Modified: trunk/freenet/src/freenet/node/NodeARKInserter.java
===================================================================
--- trunk/freenet/src/freenet/node/NodeARKInserter.java 2007-06-28 19:15:14 UTC
(rev 13815)
+++ trunk/freenet/src/freenet/node/NodeARKInserter.java 2007-06-28 20:57:14 UTC
(rev 13816)
@@ -29,6 +29,7 @@
*
*/
private final Node node;
+ private final NodeCrypto crypto;
private final NodeIPDetector detector;
private static boolean logMINOR;
@@ -36,8 +37,9 @@
* @param node
* @param old If true, use the old ARK rather than the new ARK
*/
- NodeARKInserter(Node node, NodeIPDetector detector) {
+ NodeARKInserter(Node node, NodeCrypto crypto, NodeIPDetector detector) {
this.node = node;
+ this.crypto = crypto;
this.detector = detector;
logMINOR = Logger.shouldLog(Logger.MINOR, this);
}
@@ -128,8 +130,8 @@
Bucket b = new SimpleReadOnlyArrayBucket(buf);
- long number = node.darknetARKNumber;
- InsertableClientSSK ark = node.darknetARK;
+ long number = crypto.myARKNumber;
+ InsertableClientSSK ark = crypto.myARK;
FreenetURI uri =
ark.getInsertURI().setKeyType("USK").setSuggestedEdition(number);
if(logMINOR) Logger.minor(this, "Inserting ARK: "+uri);
@@ -210,12 +212,12 @@
public void onGeneratedURI(FreenetURI uri, BaseClientPutter state) {
if(logMINOR) Logger.minor(this, "Generated URI for ARK: "+uri);
long l = uri.getSuggestedEdition();
- if(l < this.node.darknetARKNumber) {
- Logger.error(this, "Inserted edition # lower than
attempted: "+l+" expected "+this.node.darknetARKNumber);
- } else if(l > this.node.darknetARKNumber) {
- if(logMINOR) Logger.minor(this, "ARK number moving from
"+this.node.darknetARKNumber+" to "+l);
- this.node.darknetARKNumber = l;
- this.node.writeNodeFile();
+ if(l < crypto.myARKNumber) {
+ Logger.error(this, "Inserted edition # lower than
attempted: "+l+" expected "+crypto.myARKNumber);
+ } else if(l > crypto.myARKNumber) {
+ if(logMINOR) Logger.minor(this, "ARK number moving from
"+crypto.myARKNumber+" to "+l);
+ crypto.myARKNumber = l;
+ node.writeNodeFile();
}
}
Modified: trunk/freenet/src/freenet/node/NodeClientCore.java
===================================================================
--- trunk/freenet/src/freenet/node/NodeClientCore.java 2007-06-28 19:15:14 UTC
(rev 13815)
+++ trunk/freenet/src/freenet/node/NodeClientCore.java 2007-06-28 20:57:14 UTC
(rev 13816)
@@ -40,7 +40,6 @@
import freenet.keys.SSKBlock;
import freenet.keys.SSKVerifyException;
import freenet.l10n.L10n;
-import freenet.node.Node.NodeInitException;
import freenet.node.fcp.FCPServer;
import freenet.node.useralerts.UserAlertManager;
import freenet.store.KeyCollisionException;
@@ -158,14 +157,14 @@
tempDir = new File(nodeConfig.getString("tempDir"));
if(!((tempDir.exists() && tempDir.isDirectory()) ||
(tempDir.mkdir()))) {
String msg = "Could not find or create temporary
directory";
- throw new NodeInitException(Node.EXIT_BAD_TEMP_DIR,
msg);
+ throw new
NodeInitException(NodeInitException.EXIT_BAD_TEMP_DIR, msg);
}
try {
tempFilenameGenerator = new FilenameGenerator(random,
true, tempDir, "temp-");
} catch (IOException e) {
String msg = "Could not find or create temporary
directory (filename generator)";
- throw new NodeInitException(Node.EXIT_BAD_TEMP_DIR,
msg);
+ throw new
NodeInitException(NodeInitException.EXIT_BAD_TEMP_DIR, msg);
}
// Persistent temp files
@@ -186,7 +185,7 @@
persistentEncryptedTempBucketFactory = new
PersistentEncryptedTempBucketFactory(persistentTempBucketFactory);
} catch (IOException e2) {
String msg = "Could not find or create persistent
temporary directory";
- throw new NodeInitException(Node.EXIT_BAD_TEMP_DIR,
msg);
+ throw new
NodeInitException(NodeInitException.EXIT_BAD_TEMP_DIR, msg);
}
tempBucketFactory = new
PaddedEphemerallyEncryptedBucketFactory(new
TempBucketFactory(tempFilenameGenerator), random, 1024);
@@ -215,7 +214,7 @@
String val = nodeConfig.getString("downloadsDir");
downloadDir = new File(val);
if(!((downloadDir.exists() && downloadDir.isDirectory()) ||
(downloadDir.mkdir()))) {
- throw new
NodeInitException(Node.EXIT_BAD_DOWNLOADS_DIR, "Could not find or create
default downloads directory");
+ throw new
NodeInitException(NodeInitException.EXIT_BAD_DOWNLOADS_DIR, "Could not find or
create default downloads directory");
}
// Downloads allowed, uploads allowed
@@ -417,16 +416,16 @@
TextModeClientInterfaceServer.maybeCreate(node, config);
} catch (IOException e) {
e.printStackTrace();
- throw new
NodeInitException(Node.EXIT_COULD_NOT_START_TMCI, "Could not start TMCI: "+e);
+ throw new
NodeInitException(NodeInitException.EXIT_COULD_NOT_START_TMCI, "Could not start
TMCI: "+e);
}
// FCP (including persistent requests so needs to start before
FProxy)
try {
fcpServer = FCPServer.maybeCreate(node, this,
node.config);
} catch (IOException e) {
- throw new
NodeInitException(Node.EXIT_COULD_NOT_START_FCP, "Could not start FCP: "+e);
+ throw new
NodeInitException(NodeInitException.EXIT_COULD_NOT_START_FCP, "Could not start
FCP: "+e);
} catch (InvalidConfigValueException e) {
- throw new
NodeInitException(Node.EXIT_COULD_NOT_START_FCP, "Could not start FCP: "+e);
+ throw new
NodeInitException(NodeInitException.EXIT_COULD_NOT_START_FCP, "Could not start
FCP: "+e);
}
SubConfig fproxyConfig = new SubConfig("fproxy", config);
@@ -438,9 +437,9 @@
FProxyToadlet.maybeCreateFProxyEtc(this, node, config,
fproxyConfig);
} catch (IOException e) {
e.printStackTrace();
- throw new
NodeInitException(Node.EXIT_COULD_NOT_START_FPROXY, "Could not start FProxy:
"+e);
+ throw new
NodeInitException(NodeInitException.EXIT_COULD_NOT_START_FPROXY, "Could not
start FProxy: "+e);
} catch (InvalidConfigValueException e) {
- throw new
NodeInitException(Node.EXIT_COULD_NOT_START_FPROXY, "Could not start FProxy:
"+e);
+ throw new
NodeInitException(NodeInitException.EXIT_COULD_NOT_START_FPROXY, "Could not
start FProxy: "+e);
}
Thread completer = new Thread(new Runnable() {
Added: trunk/freenet/src/freenet/node/NodeCrypto.java
===================================================================
--- trunk/freenet/src/freenet/node/NodeCrypto.java
(rev 0)
+++ trunk/freenet/src/freenet/node/NodeCrypto.java 2007-06-28 20:57:14 UTC
(rev 13816)
@@ -0,0 +1,304 @@
+package freenet.node;
+
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.math.BigInteger;
+import java.net.InetAddress;
+import java.net.MalformedURLException;
+import java.security.MessageDigest;
+
+import net.i2p.util.NativeBigInteger;
+
+import freenet.config.InvalidConfigValueException;
+import freenet.config.SubConfig;
+import freenet.crypt.DSA;
+import freenet.crypt.DSAGroup;
+import freenet.crypt.DSAPrivateKey;
+import freenet.crypt.DSAPublicKey;
+import freenet.crypt.DSASignature;
+import freenet.crypt.Global;
+import freenet.crypt.RandomSource;
+import freenet.crypt.SHA256;
+import freenet.io.comm.UdpSocketHandler;
+import freenet.keys.FreenetURI;
+import freenet.keys.InsertableClientSSK;
+import freenet.support.Base64;
+import freenet.support.Fields;
+import freenet.support.IllegalBase64Exception;
+import freenet.support.Logger;
+import freenet.support.SimpleFieldSet;
+import freenet.support.api.IntCallback;
+import freenet.support.api.StringCallback;
+
+/**
+ * Cryptographic and transport level node identity.
+ * @author toad
+ */
+class NodeCrypto {
+
+ final RandomSource random;
+ /** The object which handles our specific UDP port, pulls messages from
it, feeds them to the packet mangler for decryption etc */
+ UdpSocketHandler socket;
+ public FNPPacketMangler packetMangler;
+ final String bindto;
+ // FIXME: abstract out address stuff? Possibly to something like
NodeReference?
+ final int portNumber;
+ byte[] myIdentity; // FIXME: simple identity block; should be unique
+ /** Hash of identity. Used as setup key. */
+ byte[] identityHash;
+ /** Hash of hash of identity i.e. hash of setup key. */
+ byte[] identityHashHash;
+ /** My crypto group */
+ private DSAGroup cryptoGroup;
+ /** My private key */
+ private DSAPrivateKey privKey;
+ /** My public key */
+ private DSAPublicKey pubKey;
+ /** My ARK SSK private key */
+ InsertableClientSSK myARK;
+ /** My ARK sequence number */
+ long myARKNumber;
+ static boolean logMINOR;
+
+ /**
+ * Get port number from a config, create socket and packet mangler
+ * @throws NodeInitException
+ */
+ public NodeCrypto(SubConfig nodeConfig, int sortOrder, Node node)
throws NodeInitException {
+
+ random = node.random;
+ logMINOR = Logger.shouldLog(Logger.MINOR, this);
+
+ nodeConfig.register("listenPort", -1 /* means random */,
sortOrder++, true, true, "Node.port", "Node.portLong", new IntCallback() {
+ public int get() {
+ return portNumber;
+ }
+ public void set(int val) throws
InvalidConfigValueException {
+ // FIXME implement on the fly listenPort
changing
+ // Note that this sort of thing should be the
exception rather than the rule!!!!
+ String msg = "Switching listenPort on the fly
not yet supported!";
+ Logger.error(this, msg);
+ throw new InvalidConfigValueException(msg);
+ }
+ });
+
+ int port=-1;
+ try{
+ port=nodeConfig.getInt("listenPort");
+ }catch (Exception e){
+ Logger.error(this, "Caught "+e, e);
+ System.err.println(e);
+ e.printStackTrace();
+ port=-1;
+ }
+
+ nodeConfig.register("bindTo", "0.0.0.0", sortOrder++, true,
true, "Node.bindTo", "Node.bindToLong", new NodeBindtoCallback());
+
+ this.bindto = nodeConfig.getString("bindTo");
+
+ UdpSocketHandler u = null;
+
+ if(port > 65535) {
+ throw new
NodeInitException(NodeInitException.EXIT_IMPOSSIBLE_USM_PORT, "Impossible port
number: "+port);
+ } else if(port == -1) {
+ // Pick a random port
+ for(int i=0;i<200000;i++) {
+ int portNo = 1024 + random.nextInt(65535-1024);
+ try {
+ u = new UdpSocketHandler(portNo,
InetAddress.getByName(bindto), node);
+ port = u.getPortNumber();
+ break;
+ } catch (Exception e) {
+ Logger.normal(this, "Could not use
port: "+bindto+ ':' +portNo+": "+e, e);
+ System.err.println("Could not use port:
"+bindto+ ':' +portNo+": "+e);
+ e.printStackTrace();
+ continue;
+ }
+ }
+ if(u == null)
+ throw new
NodeInitException(NodeInitException.EXIT_NO_AVAILABLE_UDP_PORTS, "Could not
find an available UDP port number for FNP (none specified)");
+ } else {
+ try {
+ u = new UdpSocketHandler(port,
InetAddress.getByName(bindto), node);
+ } catch (Exception e) {
+ throw new
NodeInitException(NodeInitException.EXIT_IMPOSSIBLE_USM_PORT, "Could not bind
to port: "+port+" (node already running?)");
+ }
+ }
+ socket = u;
+
+ Logger.normal(this, "FNP port created on "+bindto+ ':' +port);
+ System.out.println("FNP port created on "+bindto+ ':' +port);
+ portNumber = port;
+
+ nodeConfig.register("testingDropPacketsEvery", 0, sortOrder++,
true, false, "Node.dropPacketEvery", "Node.dropPacketEveryLong",
+ new IntCallback() {
+
+ public int get() {
+ return
((UdpSocketHandler)socket).getDropProbability();
+ }
+
+ public void set(int val) throws
InvalidConfigValueException {
+
((UdpSocketHandler)socket).setDropProbability(val);
+ }
+
+ });
+
+ int dropProb = nodeConfig.getInt("testingDropPacketsEvery");
+ ((UdpSocketHandler)socket).setDropProbability(dropProb);
+
+ socket.setLowLevelFilter(packetMangler = new
FNPPacketMangler(node, this, socket));
+ }
+
+ class NodeBindtoCallback implements StringCallback {
+
+ public String get() {
+ return bindto;
+ }
+
+ public void set(String val) throws InvalidConfigValueException {
+ if(val.equals(get())) return;
+ // FIXME why not? Can't we use
freenet.io.NetworkInterface like everywhere else, just adapt it for UDP?
+ throw new InvalidConfigValueException("Cannot be
updated on the fly");
+ }
+ }
+
+ /**
+ * Read the cryptographic keys etc from a SimpleFieldSet
+ * @param fs
+ * @throws IOException
+ */
+ public void readCrypto(SimpleFieldSet fs) throws IOException {
+ String identity = fs.get("identity");
+ if(identity == null)
+ throw new IOException();
+ try {
+ myIdentity = Base64.decode(identity);
+ } catch (IllegalBase64Exception e2) {
+ throw new IOException();
+ }
+ identityHash = SHA256.digest(myIdentity);
+ identityHashHash = SHA256.digest(identityHash);
+
+ try {
+ cryptoGroup = DSAGroup.create(fs.subset("dsaGroup"));
+ privKey = DSAPrivateKey.create(fs.subset("dsaPrivKey"),
cryptoGroup);
+ pubKey = DSAPublicKey.create(fs.subset("dsaPubKey"),
cryptoGroup);
+ } catch (IllegalBase64Exception e) {
+ if(logMINOR) Logger.minor(this, "Caught "+e, e);
+ this.cryptoGroup = Global.DSAgroupBigA;
+ this.privKey = new DSAPrivateKey(cryptoGroup, random);
+ this.pubKey = new DSAPublicKey(cryptoGroup, privKey);
+ }
+ InsertableClientSSK ark = null;
+
+ // ARK
+
+ String s = fs.get("ark.number");
+
+ String privARK = fs.get("ark.privURI");
+ try {
+ if(privARK != null) {
+ FreenetURI uri = new FreenetURI(privARK);
+ ark = InsertableClientSSK.create(uri);
+ if(ark.isInsecure() || s == null) {
+ if(ark.isInsecure())
+ System.out.println("Creating
new ARK, old is insecure");
+ ark = null;
+ myARKNumber = 0;
+ } else {
+ try {
+ myARKNumber = Long.parseLong(s);
+ } catch (NumberFormatException e) {
+ myARKNumber = 0;
+ ark = null;
+ }
+ }
+ }
+ } catch (MalformedURLException e) {
+ Logger.minor(this, "Caught "+e, e);
+ ark = null;
+ }
+ if(ark == null) {
+ ark = InsertableClientSSK.createRandom(random, "ark");
+ myARKNumber = 0;
+ }
+ myARK = ark;
+
+ }
+
+ /**
+ * Create the cryptographic keys etc from scratch
+ */
+ public void initCrypto() {
+ myIdentity = new byte[32];
+ random.nextBytes(myIdentity);
+ MessageDigest md = SHA256.getMessageDigest();
+ identityHash = md.digest(myIdentity);
+ identityHashHash = md.digest(identityHash);
+ cryptoGroup = Global.DSAgroupBigA;
+ privKey = new DSAPrivateKey(cryptoGroup, random);
+ pubKey = new DSAPublicKey(cryptoGroup, privKey);
+ myARK = InsertableClientSSK.createRandom(random, "ark");
+ myARKNumber = 0;
+ SHA256.returnMessageDigest(md);
+ }
+
+ public void start(boolean disableHangchecker) {
+ socket.start(disableHangchecker);
+ }
+
+ SimpleFieldSet exportPublicFieldSet(boolean forSetup) {
+ SimpleFieldSet fs = new SimpleFieldSet(true);
+ int[] negTypes = packetMangler.supportedNegTypes();
+ fs.put("auth.negTypes", negTypes);
+ fs.putSingle("identity", Base64.encode(myIdentity)); // FIXME
!forSetup after 11104 is mandatory
+ if(!forSetup) {
+ // These are invariant. They cannot change on
connection setup. They can safely be excluded.
+ fs.put("dsaGroup", cryptoGroup.asFieldSet());
+ fs.put("dsaPubKey", pubKey.asFieldSet());
+ }
+ fs.put("ark.number", myARKNumber); // Can be changed on setup
+ fs.putSingle("ark.pubURI", myARK.getURI().toString(false,
false)); // Can be changed on setup
+ return fs;
+ }
+
+ DSASignature signRef(String mySignedReference) throws NodeInitException
{
+ if(logMINOR) Logger.minor(this, "Signing
reference:\n"+mySignedReference);
+
+ try{
+ byte[] ref = mySignedReference.getBytes("UTF-8");
+ BigInteger m = new BigInteger(1, SHA256.digest(ref));
+ if(logMINOR) Logger.minor(this, "m = "+m.toString(16));
+ DSASignature myReferenceSignature =
DSA.sign(cryptoGroup, privKey, m, random);
+ // FIXME remove this ... eventually
+ if(!DSA.verify(pubKey, myReferenceSignature, m, false))
+ Logger.error(this, "Signature failed!");
+ return myReferenceSignature;
+ } catch(UnsupportedEncodingException e){
+ //duh ?
+ Logger.error(this, "Error while signing the node
identity!"+e);
+ System.err.println("Error while signing the node
identity!"+e);
+ e.printStackTrace();
+ throw new
NodeInitException(NodeInitException.EXIT_CRAPPY_JVM, "UTF-8 not supported!");
+ }
+ }
+
+ void addPrivateFields(SimpleFieldSet fs) {
+ fs.put("dsaPrivKey", privKey.asFieldSet());
+ fs.putSingle("ark.privURI",
myARK.getInsertURI().toString(false, false));
+ }
+
+ public String getBindTo(){
+ return this.bindto;
+ }
+
+ public int getIdentityHash(){
+ return Fields.hashCode(identityHash);
+ }
+
+ /** Sign a hash */
+ DSASignature sign(byte[] hash) {
+ return DSA.sign(cryptoGroup, privKey, new NativeBigInteger(1,
hash), random);
+ }
+
+}
Modified: trunk/freenet/src/freenet/node/NodeDispatcher.java
===================================================================
--- trunk/freenet/src/freenet/node/NodeDispatcher.java 2007-06-28 19:15:14 UTC
(rev 13815)
+++ trunk/freenet/src/freenet/node/NodeDispatcher.java 2007-06-28 20:57:14 UTC
(rev 13816)
@@ -234,12 +234,12 @@
long now = System.currentTimeMillis();
if(m.getSpec().equals(DMT.FNPSSKInsertRequest)) {
SSKInsertHandler rh = new SSKInsertHandler(m, id, node,
now);
- Thread t = new Thread(rh, "InsertHandler for "+id+" on
"+node.darknetPortNumber);
+ Thread t = new Thread(rh, "InsertHandler for "+id+" on
"+node.getDarknetPortNumber());
t.setDaemon(true);
t.start();
} else {
InsertHandler rh = new InsertHandler(m, id, node, now);
- Thread t = new Thread(rh, "InsertHandler for "+id+" on
"+node.darknetPortNumber);
+ Thread t = new Thread(rh, "InsertHandler for "+id+" on
"+node.getDarknetPortNumber());
t.setDaemon(true);
t.start();
}
@@ -326,7 +326,7 @@
double target = m.getDouble(DMT.TARGET_LOCATION);
if(logMINOR) Logger.minor(this, "id "+id+" from "+pn+" htl
"+htl+" target "+target);
if(Math.abs(node.lm.getLocation().getValue() - target) <=
Double.MIN_VALUE) {
- if(logMINOR) Logger.minor(this, "Dispatching
"+m.getSpec()+" on "+node.darknetPortNumber);
+ if(logMINOR) Logger.minor(this, "Dispatching
"+m.getSpec()+" on "+node.getDarknetPortNumber());
// Handle locally
// Message type specific processing
dispatchRoutedMessage(m, pn, id);
@@ -380,7 +380,7 @@
continue;
}
} else {
- if(logMINOR) Logger.minor(this, "Reached dead
end for "+m.getSpec()+" on "+node.darknetPortNumber);
+ if(logMINOR) Logger.minor(this, "Reached dead
end for "+m.getSpec()+" on "+node.getDarknetPortNumber());
// Reached a dead end...
Message reject =
DMT.createFNPRoutedRejected(id, htl);
if(pn != null) try {
Modified: trunk/freenet/src/freenet/node/NodeIPDetector.java
===================================================================
--- trunk/freenet/src/freenet/node/NodeIPDetector.java 2007-06-28 19:15:14 UTC
(rev 13815)
+++ trunk/freenet/src/freenet/node/NodeIPDetector.java 2007-06-28 20:57:14 UTC
(rev 13816)
@@ -28,6 +28,7 @@
/** Parent node */
final Node node;
+ final NodeCrypto crypto;
/** Ticker */
final Ticker ticker;
/** Explicit forced IP address */
@@ -59,13 +60,14 @@
SimpleUserAlert maybeSymmetricAlert;
- public NodeIPDetector(Node node) {
+ public NodeIPDetector(Node node, NodeCrypto crypto) {
this.node = node;
+ this.crypto = crypto;
this.ticker = node.ps;
ipDetectorManager = new IPDetectorPluginManager(node, this);
ipDetector = new IPAddressDetector(10*1000, this);
primaryIPUndetectedAlert = new IPUndetectedUserAlert(node);
- arkPutter = new NodeARKInserter(node, this);
+ arkPutter = new NodeARKInserter(node, crypto, this);
}
/**
@@ -76,28 +78,29 @@
*/
Peer[] detectPrimaryIPAddress() {
boolean addedValidIP = false;
+ int portNumber = crypto.portNumber;
Logger.minor(this, "Redetecting IPs...");
Vector addresses = new Vector();
if(overrideIPAddress != null) {
// If the IP is overridden, the override has to be the
first element.
- Peer p = new Peer(overrideIPAddress,
node.darknetPortNumber);
+ Peer p = new Peer(overrideIPAddress, portNumber);
addresses.add(p);
if(p.getFreenetAddress().isRealInternetAddress(false,
true))
addedValidIP = true;
}
boolean dontDetect = false;
- UdpSocketHandler sock = node.darknetSocket;
+ UdpSocketHandler sock = crypto.socket;
if(sock != null) {
InetAddress addr = sock.getBindTo();
if(addr != null && (IPUtil.isValidAddress(addr,
false))) {
dontDetect = true;
- Peer p = new Peer(addr, node.darknetPortNumber);
+ Peer p = new Peer(addr, portNumber);
if(!addresses.contains(p)) addresses.add(p);
dontDetect = true;
}
}
if(!dontDetect) {
- addedValidIP = innerDetect(addresses, addedValidIP);
+ addedValidIP = innerDetect(addresses, addedValidIP,
portNumber);
}
if(node.clientCore != null) {
if (addedValidIP) {
@@ -110,7 +113,7 @@
return lastIPAddress;
}
- private boolean innerDetect(Vector addresses, boolean addedValidIP) {
+ private boolean innerDetect(Vector addresses, boolean addedValidIP, int
portNumber) {
boolean setMaybeSymmetric = false;
InetAddress[] detectedAddrs = ipDetector.getAddress();
assert(detectedAddrs != null);
@@ -119,7 +122,7 @@
}
for(int i=0;i<detectedAddrs.length;i++) {
- Peer p = new Peer(detectedAddrs[i],
node.darknetPortNumber);
+ Peer p = new Peer(detectedAddrs[i], portNumber);
if(!addresses.contains(p)) {
Logger.normal(this, "Detected IP address: "+p);
addresses.add(p);
@@ -132,7 +135,7 @@
for(int i=0;i<pluginDetectedIPs.length;i++) {
InetAddress addr =
pluginDetectedIPs[i].publicAddress;
if(addr == null) continue;
- Peer a = new Peer(new FreenetInetAddress(addr),
node.darknetPortNumber);
+ Peer a = new Peer(new FreenetInetAddress(addr),
portNumber);
if(!addresses.contains(a)) {
Logger.normal(this, "Plugin detected IP
address: "+a);
addresses.add(a);
@@ -141,7 +144,7 @@
}
}
if(addresses.isEmpty() && (oldIPAddress != null) &&
!oldIPAddress.equals(overrideIPAddress))
- addresses.add(new Peer(oldIPAddress,
node.darknetPortNumber));
+ addresses.add(new Peer(oldIPAddress, portNumber));
// Try to pick it up from our connections
if(node.peers != null) {
PeerNode[] peerList = node.peers.connectedPeers;
@@ -220,7 +223,7 @@
node.clientCore.alerts.unregister(maybeSymmetricAlert);
}
- Peer p = new
Peer(best.getFreenetAddress(), node.darknetPortNumber);
+ Peer p = new
Peer(best.getFreenetAddress(), portNumber);
if(!addresses.contains(p))
addresses.add(p);
}
Added: trunk/freenet/src/freenet/node/NodeInitException.java
===================================================================
--- trunk/freenet/src/freenet/node/NodeInitException.java
(rev 0)
+++ trunk/freenet/src/freenet/node/NodeInitException.java 2007-06-28
20:57:14 UTC (rev 13816)
@@ -0,0 +1,43 @@
+/**
+ *
+ */
+package freenet.node;
+
+public class NodeInitException extends Exception {
+ // One of the exit codes from above
+ public final int exitCode;
+ public static final int EXIT_BAD_BWLIMIT = 26;
+ public static final int EXIT_TEST_ERROR = 25;
+ public static final int EXIT_RESTART_FAILED = 24;
+ public static final int EXIT_THROTTLE_FILE_ERROR = 23;
+ public static final int EXIT_EXTRA_PEER_DATA_DIR = 22;
+ public static final int EXIT_COULD_NOT_START_UPDATER = 21;
+ public static final int EXIT_DATABASE_REQUIRES_RESTART = 20;
+ public static final int EXIT_CRAPPY_JVM = 255;
+ public static final int EXIT_COULD_NOT_START_TMCI = 19;
+ public static final int EXIT_COULD_NOT_START_FPROXY = 18;
+ public static final int EXIT_COULD_NOT_START_FCP = 17;
+ public static final int EXIT_BAD_TEMP_DIR = 16;
+ public static final int EXIT_BAD_NODE_DIR = 15;
+ public static final int EXIT_BAD_DOWNLOADS_DIR = 14;
+ public static final int EXIT_INVALID_STORE_SIZE = 13;
+ public static final int EXIT_TESTNET_DISABLED_NOT_SUPPORTED = 12;
+ public static final int EXIT_NO_AVAILABLE_UDP_PORTS = 11;
+ public static final int EXIT_IMPOSSIBLE_USM_PORT = 10;
+ public static final int EXIT_COULD_NOT_BIND_USM = 9;
+ public static final int EXIT_MAIN_LOOP_LOST = 8;
+ public static final int EXIT_TESTNET_FAILED = 7;
+ public static final int EXIT_TEMP_INIT_ERROR = 6;
+ public static final int EXIT_YARROW_INIT_FAILED = 5;
+ public static final int EXIT_USM_DIED = 4;
+ public static final int EXIT_STORE_RECONSTRUCT = 27;
+ public static final int EXIT_STORE_OTHER = 3;
+ public static final int EXIT_STORE_IOEXCEPTION = 2;
+ public static final int EXIT_STORE_FILE_NOT_FOUND = 1;
+ private static final long serialVersionUID = -1;
+
+ NodeInitException(int exitCode, String msg) {
+ super(msg+" ("+exitCode+ ')');
+ this.exitCode = exitCode;
+ }
+}
\ No newline at end of file
Modified: trunk/freenet/src/freenet/node/NodeStarter.java
===================================================================
--- trunk/freenet/src/freenet/node/NodeStarter.java 2007-06-28 19:15:14 UTC
(rev 13815)
+++ trunk/freenet/src/freenet/node/NodeStarter.java 2007-06-28 20:57:14 UTC
(rev 13816)
@@ -16,7 +16,6 @@
import freenet.crypt.DiffieHellman;
import freenet.crypt.RandomSource;
import freenet.crypt.Yarrow;
-import freenet.node.Node.NodeInitException;
import freenet.support.Logger;
import freenet.support.SimpleFieldSet;
import freenet.support.LoggerHook.InvalidThresholdException;
@@ -267,7 +266,7 @@
File dir = new File(testName);
if((!dir.mkdir()) && ((!dir.exists()) || (!dir.isDirectory())))
{
System.err.println("Cannot create directory for test");
- System.exit(Node.EXIT_TEST_ERROR);
+ System.exit(NodeInitException.EXIT_TEST_ERROR);
}
Logger.setupStdoutLogging(Logger.MINOR, "");
@@ -332,7 +331,7 @@
File portDir = new File(baseDir, Integer.toString(port));
if((!portDir.mkdir()) && ((!portDir.exists()) ||
(!portDir.isDirectory()))) {
System.err.println("Cannot create directory for test");
- System.exit(Node.EXIT_TEST_ERROR);
+ System.exit(NodeInitException.EXIT_TEST_ERROR);
}
// Set up config for testing
Modified: trunk/freenet/src/freenet/node/NodeStats.java
===================================================================
--- trunk/freenet/src/freenet/node/NodeStats.java 2007-06-28 19:15:14 UTC
(rev 13815)
+++ trunk/freenet/src/freenet/node/NodeStats.java 2007-06-28 20:57:14 UTC
(rev 13816)
@@ -11,7 +11,6 @@
import freenet.io.comm.DMT;
import freenet.io.comm.IOStatisticCollector;
import freenet.l10n.L10n;
-import freenet.node.Node.NodeInitException;
import freenet.support.HTMLNode;
import freenet.support.Logger;
import freenet.support.SimpleFieldSet;
@@ -304,7 +303,7 @@
new TokenBucket(Math.max(ibwLimit*60, 32768*20),
(int)((1000L*1000L*1000L) / (ibwLimit *
FRACTION_OF_BANDWIDTH_USED_BY_REQUESTS)), 0);
estimatedSizeOfOneThrottledPacket = 1024 +
DMT.packetTransmitSize(1024, 32) +
- node.darknetPacketMangler.fullHeadersLengthOneMessage();
+ node.estimateFullHeadersLengthOneMessage();
}
protected String l10n(String key) {
Modified: trunk/freenet/src/freenet/node/PacketSender.java
===================================================================
--- trunk/freenet/src/freenet/node/PacketSender.java 2007-06-28 19:15:14 UTC
(rev 13815)
+++ trunk/freenet/src/freenet/node/PacketSender.java 2007-06-28 20:57:14 UTC
(rev 13816)
@@ -49,7 +49,7 @@
resendPackets = new LinkedList();
timedJobsByTime = new TreeMap();
this.node = node;
- myThread = new Thread(this, "PacketSender thread for
"+node.darknetPortNumber);
+ myThread = new Thread(this, "PacketSender thread for
"+node.getDarknetPortNumber());
myThread.setDaemon(true);
myThread.setPriority(Thread.MAX_PRIORITY);
logMINOR = Logger.shouldLog(Logger.MINOR, this);
@@ -226,7 +226,7 @@
if(item == null) continue;
try {
if(logMINOR) Logger.minor(this, "Resending
"+item.packetNumber+" to "+item.kt);
- node.darknetPacketMangler.resend(item);
+ pn.getOutgoingMangler().resend(item);
mustSend = false;
} catch (KeyChangedException e) {
Logger.error(this, "Caught "+e+" resending packets
to "+kt);
@@ -246,7 +246,6 @@
}
- if(node.darknetPacketMangler == null) continue;
// Any messages to send?
MessageItem[] messages = null;
messages = pn.grabQueuedMessageItems();
@@ -267,7 +266,7 @@
if(logMINOR) Logger.minor(this, "PS
Sending: "+(messages[j].msg == null ? "(not a Message)" :
messages[j].msg.getSpec().getName()));
}
// Send packets, right now, blocking, including
any active notifications
-
node.darknetPacketMangler.processOutgoingOrRequeue(messages, pn, true, false);
+
pn.getOutgoingMangler().processOutgoingOrRequeue(messages, pn, true, false);
continue;
}
}
@@ -288,14 +287,14 @@
// Force packet to have a sequence number.
Message m = DMT.createFNPVoid();
pn.addToLocalNodeSentMessagesToStatistic(m);
- node.darknetPacketMangler.processOutgoingOrRequeue(new
MessageItem[] { new MessageItem(m, null, 0, null) }, pn, true, true);
+ pn.getOutgoingMangler().processOutgoingOrRequeue(new
MessageItem[] { new MessageItem(m, null, 0, null) }, pn, true, true);
}
} else {
// Not connected
// Send handshake if necessary
long beforeHandshakeTime = System.currentTimeMillis();
if(pn.shouldSendHandshake())
- node.darknetPacketMangler.sendHandshake(pn);
+ pn.getOutgoingMangler().sendHandshake(pn);
if(pn.noContactDetails())
pn.startARKFetcher();
long afterHandshakeTime = System.currentTimeMillis();
Modified: trunk/freenet/src/freenet/node/PeerManager.java
===================================================================
--- trunk/freenet/src/freenet/node/PeerManager.java 2007-06-28 19:15:14 UTC
(rev 13815)
+++ trunk/freenet/src/freenet/node/PeerManager.java 2007-06-28 20:57:14 UTC
(rev 13816)
@@ -93,7 +93,7 @@
* @param node
* @param filename
*/
- public PeerManager(Node node, String filename, OutgoingPacketMangler
mangler) {
+ public PeerManager(Node node, NodeCrypto crypto, String filename,
OutgoingPacketMangler mangler) {
Logger.normal(this, "Creating PeerManager");
logMINOR = Logger.shouldLog(Logger.MINOR, this);
peerNodeStatuses = new HashMap();
@@ -107,7 +107,7 @@
File backupFile = new File(filename+".bak");
// Try to read the node list from disk
if(peersFile.exists()) {
- if(readPeers(peersFile, mangler)) {
+ if(readPeers(peersFile, mangler, crypto)) {
String msg = "Read "+myPeers.length+" peers from
"+peersFile;
Logger.normal(this, msg);
System.out.println(msg);
@@ -116,7 +116,7 @@
}
// Try the backup
if(backupFile.exists()) {
- if(readPeers(backupFile, mangler)) {
+ if(readPeers(backupFile, mangler, crypto)) {
String msg = "Read "+myPeers.length+" peers from
"+backupFile;
Logger.normal(this, msg);
System.out.println(msg);
@@ -127,7 +127,7 @@
}
}
- private boolean readPeers(File peersFile, OutgoingPacketMangler mangler) {
+ private boolean readPeers(File peersFile, OutgoingPacketMangler mangler,
NodeCrypto crypto) {
boolean gotSome = false;
FileInputStream fis;
try {
@@ -150,7 +150,7 @@
fs = new SimpleFieldSet(br, false, true);
PeerNode pn;
try {
- pn = PeerNode.create(fs, node, this, true, mangler);
+ pn = PeerNode.create(fs, node, crypto, this, true,
mangler);
} catch (FSParseException e2) {
Logger.error(this, "Could not parse peer: "+e2+ '\n'
+fs.toString(),e2);
continue;
@@ -328,7 +328,7 @@
* Connect to a node provided the fieldset representing it.
*/
public void connect(SimpleFieldSet noderef, OutgoingPacketMangler mangler)
throws FSParseException, PeerParseException,
ReferenceSignatureVerificationException {
- PeerNode pn = new DarknetPeerNode(noderef, node, this, false, mangler);
+ PeerNode pn = node.createNewDarknetNode(noderef);
for(int i=0;i<myPeers.length;i++) {
if(Arrays.equals(myPeers[i].identity, pn.identity)) return;
}
Modified: trunk/freenet/src/freenet/node/PeerNode.java
===================================================================
--- trunk/freenet/src/freenet/node/PeerNode.java 2007-06-28 19:15:14 UTC
(rev 13815)
+++ trunk/freenet/src/freenet/node/PeerNode.java 2007-06-28 20:57:14 UTC
(rev 13816)
@@ -314,7 +314,7 @@
* @param fs The SimpleFieldSet to parse
* @param node2 The running Node we are part of.
*/
- public PeerNode(SimpleFieldSet fs, Node node2, PeerManager peers, boolean
fromLocal, OutgoingPacketMangler mangler) throws FSParseException,
PeerParseException, ReferenceSignatureVerificationException {
+ public PeerNode(SimpleFieldSet fs, Node node2, NodeCrypto crypto,
PeerManager peers, boolean fromLocal, OutgoingPacketMangler mangler) throws
FSParseException, PeerParseException, ReferenceSignatureVerificationException {
logMINOR = Logger.shouldLog(Logger.MINOR, PeerNode.class);
myRef = new WeakReference(this);
this.outgoingMangler = mangler;
@@ -425,7 +425,7 @@
Logger.error(this, "Error while signing the
node identity!"+e);
System.err.println("Error while signing the
node identity!"+e);
e.printStackTrace();
- node.exit(Node.EXIT_CRAPPY_JVM);
+ node.exit(NodeInitException.EXIT_CRAPPY_JVM);
}
}else // Local is always good (assumed)
this.isSignatureVerificationSuccessfull = true;
@@ -435,8 +435,8 @@
}
// Setup incoming and outgoing setup ciphers
- byte[] nodeKey = node.identityHash;
- byte[] nodeKeyHash = node.identityHashHash;
+ byte[] nodeKey = crypto.identityHash;
+ byte[] nodeKeyHash = crypto.identityHashHash;
int digestLength = SHA256.getDigestLength();
incomingSetupKey = new byte[digestLength];
@@ -446,7 +446,7 @@
for(int i=0;i<outgoingSetupKey.length;i++)
outgoingSetupKey[i] = (byte) (nodeKeyHash[i] ^ identityHash[i]);
if(logMINOR)
- Logger.minor(this, "Keys:\nIdentity:
"+HexUtil.bytesToHex(node.myIdentity)+
+ Logger.minor(this, "Keys:\nIdentity:
"+HexUtil.bytesToHex(crypto.myIdentity)+
"\nThisIdent: "+HexUtil.bytesToHex(identity)+
"\nNode: "+HexUtil.bytesToHex(nodeKey)+
"\nNode hash: "+HexUtil.bytesToHex(nodeKeyHash)+
@@ -1789,7 +1789,7 @@
long t = tracker.getNextUrgentTime();
if(t < now) {
try {
- node.darknetPacketMangler.processOutgoing(null, 0, 0,
tracker, 0);
+ outgoingMangler.processOutgoing(null, 0, 0, tracker, 0);
} catch (NotConnectedException e) {
// Ignore
} catch (KeyChangedException e) {
@@ -1804,7 +1804,7 @@
long t = tracker.getNextUrgentTime();
if(t < now) {
try {
- node.darknetPacketMangler.processOutgoing(null, 0, 0,
tracker, 0);
+ outgoingMangler.processOutgoing(null, 0, 0, tracker, 0);
} catch (NotConnectedException e) {
// Ignore
} catch (KeyChangedException e) {
@@ -2647,7 +2647,11 @@
/**
* Create a DarknetPeerNode or an OpennetPeerNode as appropriate
*/
- public static PeerNode create(SimpleFieldSet fs, Node node2,
PeerManager manager, boolean b, OutgoingPacketMangler mangler) throws
FSParseException, PeerParseException, ReferenceSignatureVerificationException {
- return new DarknetPeerNode(fs, node2, manager, b, mangler);
+ public static PeerNode create(SimpleFieldSet fs, Node node2, NodeCrypto
crypto, PeerManager manager, boolean b, OutgoingPacketMangler mangler) throws
FSParseException, PeerParseException, ReferenceSignatureVerificationException {
+ return new DarknetPeerNode(fs, node2, crypto, manager, b,
mangler);
}
+
+ public byte[] getIdentity() {
+ return identity;
+ }
}
Modified: trunk/freenet/src/freenet/node/SSKInsertSender.java
===================================================================
--- trunk/freenet/src/freenet/node/SSKInsertSender.java 2007-06-28 19:15:14 UTC
(rev 13815)
+++ trunk/freenet/src/freenet/node/SSKInsertSender.java 2007-06-28 20:57:14 UTC
(rev 13816)
@@ -97,7 +97,7 @@
}
void start() {
- Thread t = new Thread(this, "SSKInsertSender for UID "+uid+" on
"+node.darknetPortNumber+" at "+System.currentTimeMillis());
+ Thread t = new Thread(this, "SSKInsertSender for UID "+uid+" on
"+node.getDarknetPortNumber()+" at "+System.currentTimeMillis());
t.setDaemon(true);
t.start();
}
Modified: trunk/freenet/src/freenet/node/TestnetHandler.java
===================================================================
--- trunk/freenet/src/freenet/node/TestnetHandler.java 2007-06-28 19:15:14 UTC
(rev 13815)
+++ trunk/freenet/src/freenet/node/TestnetHandler.java 2007-06-28 20:57:14 UTC
(rev 13816)
@@ -22,7 +22,6 @@
import freenet.config.InvalidConfigValueException;
import freenet.config.SubConfig;
import freenet.l10n.L10n;
-import freenet.node.Node.NodeInitException;
import freenet.support.FileLoggerHook;
import freenet.support.Logger;
import freenet.support.SimpleFieldSet;
@@ -83,7 +82,7 @@
Logger.normal(this,"Starting testnet server on
port"+testnetPort);
} catch (IOException e) {
Logger.error(this, "Could not bind to testnet
port: "+testnetPort);
- node.exit(Node.EXIT_TESTNET_FAILED);
+
node.exit(NodeInitException.EXIT_TESTNET_FAILED);
return;
}
while(!server.isClosed()) {
@@ -106,7 +105,7 @@
this.testnetPort=port;
}catch( IOException e){
Logger.error(this, "Error while stopping the
testnet handler.");
- node.exit(Node.EXIT_TESTNET_FAILED);
+
node.exit(NodeInitException.EXIT_TESTNET_FAILED);
return;
}
}
@@ -255,7 +254,7 @@
if(enabled) {
// Get the testnet port
- testnetConfig.register("port", node.darknetPortNumber+1000, 2,
true, false, "TestnetHandler.port", "TestnetHandler.portLong",
+ testnetConfig.register("port",
node.getDarknetPortNumber()+1000, 2, true, false, "TestnetHandler.port",
"TestnetHandler.portLong",
new TestnetPortNumberCallback(node));
int port = testnetConfig.getInt("port");
Modified: trunk/freenet/src/freenet/node/TextModeClientInterface.java
===================================================================
--- trunk/freenet/src/freenet/node/TextModeClientInterface.java 2007-06-28
19:15:14 UTC (rev 13815)
+++ trunk/freenet/src/freenet/node/TextModeClientInterface.java 2007-06-28
20:57:14 UTC (rev 13816)
@@ -1016,7 +1016,7 @@
}
PeerNode pn;
try {
- pn = new DarknetPeerNode(fs, n, n.peers, false,
n.darknetPacketMangler);
+ pn = n.createNewDarknetNode(fs);
} catch (FSParseException e1) {
System.err.println("Did not parse: "+e1);
Logger.error(this, "Did not parse: "+e1, e1);
Modified: trunk/freenet/src/freenet/node/fcp/AddPeer.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/AddPeer.java 2007-06-28 19:15:14 UTC
(rev 13815)
+++ trunk/freenet/src/freenet/node/fcp/AddPeer.java 2007-06-28 20:57:14 UTC
(rev 13816)
@@ -12,6 +12,7 @@
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
+import java.util.Arrays;
import freenet.io.comm.PeerParseException;
import freenet.io.comm.ReferenceSignatureVerificationException;
@@ -112,7 +113,7 @@
fs.setEndMarker( "End" );
PeerNode pn;
try {
- pn = new DarknetPeerNode(fs, node, node.peers, false,
node.darknetPacketMangler);
+ pn = node.createNewDarknetNode(fs);
} catch (FSParseException e) {
throw new
MessageInvalidException(ProtocolErrorMessage.REF_PARSE_ERROR, "Error parsing
ref: "+e.getMessage(), null, false);
} catch (PeerParseException e) {
@@ -120,9 +121,8 @@
} catch (ReferenceSignatureVerificationException e) {
throw new
MessageInvalidException(ProtocolErrorMessage.REF_SIGNATURE_INVALID, "Error
adding ref: "+e.getMessage(), null, false);
}
- if(pn.getIdentityHash()==node.getIdentityHash()) {
+ if(Arrays.equals(pn.getIdentity(), node.getDarknetIdentity()))
throw new
MessageInvalidException(ProtocolErrorMessage.CANNOT_PEER_WITH_SELF, "Node
cannot peer with itself", null, false);
- }
if(!node.addDarknetConnection(pn)) {
throw new
MessageInvalidException(ProtocolErrorMessage.DUPLICATE_PEER_REF, "Node already
has a peer with that identity", null, false);
}
Modified: trunk/freenet/src/freenet/node/simulator/RealNodePingTest.java
===================================================================
--- trunk/freenet/src/freenet/node/simulator/RealNodePingTest.java
2007-06-28 19:15:14 UTC (rev 13815)
+++ trunk/freenet/src/freenet/node/simulator/RealNodePingTest.java
2007-06-28 20:57:14 UTC (rev 13816)
@@ -9,6 +9,7 @@
import freenet.io.comm.ReferenceSignatureVerificationException;
import freenet.node.FSParseException;
import freenet.node.Node;
+import freenet.node.NodeInitException;
import freenet.node.NodeStarter;
import freenet.node.PeerNode;
import freenet.support.Logger;
@@ -26,7 +27,7 @@
*/
public class RealNodePingTest {
- public static void main(String[] args) throws FSParseException,
PeerParseException, InterruptedException,
ReferenceSignatureVerificationException, Node.NodeInitException,
InvalidThresholdException {
+ public static void main(String[] args) throws FSParseException,
PeerParseException, InterruptedException,
ReferenceSignatureVerificationException, NodeInitException,
InvalidThresholdException {
RandomSource random = NodeStarter.globalTestInit("pingtest");
// Create 2 nodes
Node node1 = NodeStarter.createTestNode(5001, "pingtest", false,
false, true, Node.DEFAULT_MAX_HTL, 0, Node.DEFAULT_SWAP_INTERVAL, random);
Modified:
trunk/freenet/src/freenet/node/simulator/RealNodeRequestInsertTest.java
===================================================================
--- trunk/freenet/src/freenet/node/simulator/RealNodeRequestInsertTest.java
2007-06-28 19:15:14 UTC (rev 13815)
+++ trunk/freenet/src/freenet/node/simulator/RealNodeRequestInsertTest.java
2007-06-28 20:57:14 UTC (rev 13816)
@@ -17,8 +17,8 @@
import freenet.node.FSParseException;
import freenet.node.LocationManager;
import freenet.node.Node;
+import freenet.node.NodeInitException;
import freenet.node.NodeStarter;
-import freenet.node.Node.NodeInitException;
import freenet.support.Fields;
import freenet.support.HexUtil;
import freenet.support.Logger;
Modified: trunk/freenet/src/freenet/node/simulator/RealNodeRoutingTest.java
===================================================================
--- trunk/freenet/src/freenet/node/simulator/RealNodeRoutingTest.java
2007-06-28 19:15:14 UTC (rev 13815)
+++ trunk/freenet/src/freenet/node/simulator/RealNodeRoutingTest.java
2007-06-28 20:57:14 UTC (rev 13816)
@@ -12,8 +12,8 @@
import freenet.node.FSParseException;
import freenet.node.LocationManager;
import freenet.node.Node;
+import freenet.node.NodeInitException;
import freenet.node.NodeStarter;
-import freenet.node.Node.NodeInitException;
import freenet.support.Logger;
import freenet.support.LoggerHook.InvalidThresholdException;
import freenet.support.math.BootstrappingDecayingRunningAverage;
Modified: trunk/freenet/src/freenet/node/updater/NodeUpdateManager.java
===================================================================
--- trunk/freenet/src/freenet/node/updater/NodeUpdateManager.java
2007-06-28 19:15:14 UTC (rev 13815)
+++ trunk/freenet/src/freenet/node/updater/NodeUpdateManager.java
2007-06-28 20:57:14 UTC (rev 13816)
@@ -16,6 +16,7 @@
import freenet.l10n.L10n;
import freenet.node.ExtVersion;
import freenet.node.Node;
+import freenet.node.NodeInitException;
import freenet.node.NodeStarter;
import freenet.node.PeerNode;
import freenet.node.Version;
@@ -565,7 +566,7 @@
// Break
} // in case it's still restarting
System.err.println("Failed to restart. Exiting, please restart
the node.");
- System.exit(Node.EXIT_RESTART_FAILED);
+ System.exit(NodeInitException.EXIT_RESTART_FAILED);
}
private void failUpdate(String reason) {
Modified: trunk/freenet/src/freenet/store/BerkeleyDBFreenetStore.java
===================================================================
--- trunk/freenet/src/freenet/store/BerkeleyDBFreenetStore.java 2007-06-28
19:15:14 UTC (rev 13815)
+++ trunk/freenet/src/freenet/store/BerkeleyDBFreenetStore.java 2007-06-28
20:57:14 UTC (rev 13816)
@@ -1804,7 +1804,7 @@
}
Logger.error(this, "Corrupt secondary database
("+getName()+"). Should be cleaned up on restart.");
System.err.println("Corrupt secondary database
("+getName()+"). Should be cleaned up on restart.");
-
System.exit(freenet.node.Node.EXIT_DATABASE_REQUIRES_RESTART);
+
System.exit(freenet.node.NodeInitException.EXIT_DATABASE_REQUIRES_RESTART);
} else if(ex instanceof DbChecksumException || ex
instanceof RunRecoveryException) {
System.err.println("Corrupt database! Will be
reconstructed on restart");
try {