Author: dbkr
Date: 2006-03-18 03:44:08 +0000 (Sat, 18 Mar 2006)
New Revision: 8272
Modified:
trunk/freenet/src/freenet/clients/http/DarknetConnectionsToadlet.java
trunk/freenet/src/freenet/clients/http/staticfiles/themes/aqua/theme.css
trunk/freenet/src/freenet/clients/http/staticfiles/themes/clean/theme.css
trunk/freenet/src/freenet/node/Node.java
Log:
A start on adding and removing peers via. the web interface. Adding basically
works, but doesn't trim leading characters off yet. Removing doesn't work yet
at all. It will do, but not now, because I need to go to bed.
Modified: trunk/freenet/src/freenet/clients/http/DarknetConnectionsToadlet.java
===================================================================
--- trunk/freenet/src/freenet/clients/http/DarknetConnectionsToadlet.java
2006-03-18 00:04:47 UTC (rev 8271)
+++ trunk/freenet/src/freenet/clients/http/DarknetConnectionsToadlet.java
2006-03-18 03:44:08 UTC (rev 8272)
@@ -1,7 +1,12 @@
package freenet.clients.http;
import java.io.IOException;
+import java.io.BufferedReader;
+import java.io.InputStreamReader;
import java.net.URI;
+import java.net.URISyntaxException;
+import java.net.URL;
+import java.net.URLConnection;
import java.util.Arrays;
import java.util.Comparator;
@@ -9,8 +14,14 @@
import freenet.node.Node;
import freenet.node.PeerNode;
import freenet.node.Version;
+import freenet.node.FSParseException;
+import freenet.io.comm.PeerParseException;
import freenet.pluginmanager.HTTPRequest;
import freenet.support.HTMLEncoder;
+import freenet.support.Bucket;
+import freenet.support.BucketTools;
+import freenet.support.Logger;
+import freenet.support.SimpleFieldSet;
public class DarknetConnectionsToadlet extends Toadlet {
@@ -46,6 +57,15 @@
HTTPRequest request = new HTTPRequest(uri);
ctx.getPageMaker().makeHead(buf, "Darknet Connections");
+
+ // our reference
+ buf.append("<div class=\"infobox\">\n");
+ buf.append("<h2 class=\"boxhead\">My Reference</h2>\n");
+ buf.append("<pre>\n");
+ buf.append(this.node.exportFieldSet());
+ buf.append("</pre>\n");
+ buf.append("</div>\n");
+
// FIXME! 1) Probably would be better to use CSS
// FIXME! 2) We need some nice images
PeerNode[] peerNodes = node.getDarknetConnections();
@@ -53,7 +73,7 @@
long now = System.currentTimeMillis();
buf.append("<table border=\"0\">\n");
-
buf.append("<tr><th>Status</th><th>Name</th><th>Address</th><th>Version</th><th>Location</th><th>Backoff</th><th>Backoff
length</th></tr>\n");
+
buf.append("<tr><th>Status</th><th>Name</th><th>Address</th><th>Version</th><th>Location</th><th>Backoff</th><th>Backoff
length</th><th></th></tr>\n");
final Integer CONNECTED = new Integer(0);
final Integer BACKED_OFF = new Integer(1);
@@ -68,7 +88,7 @@
int backoffLength = pn.getBackoffLength();
boolean backedOffNow = (now < backedOffUntil);
- Object[] row = new Object[7];
+ Object[] row = new Object[8];
rows[i] = row;
Object status;
@@ -90,6 +110,13 @@
row[4] = new Double(pn.getLocation().getValue());
row[5] = new Long(Math.max(backedOffUntil - now, 0));
row[6] = new Long(backoffLength);
+ // TODO: Best way of identifying peers? Name isn't
unique and host/port can be null.
+ row[7] = new String("<form action=\".\"
method=\"post\">\n"
+ +"<span>"
+ +"<input type=\"hidden\" name=\"node\"
value=\"\" />"
+ +"<input type=\"submit\"
name=\"disconnect\" value=\"Disconnect\" />\n"
+ +"</span>\n"
+ +"</form>\n");
}
// Sort array
@@ -118,9 +145,96 @@
}
buf.append("</table>");
+ // new connection box
+ buf.append("<form action=\".\" method=\"post\">\n");
+ buf.append("<div class=\"infobox\">\n");
+ buf.append("<h2 class=\"boxhead\">\n");
+ buf.append("Connect to another node\n");
+ buf.append("</h2>\n");
+ buf.append("Reference:<br />\n");
+ buf.append("<textarea name=\"ref\" rows=\"8\"
cols=\"74\"></textarea>\n");
+ buf.append("<br />\n");
+ buf.append("or URL:\n");
+ buf.append("<input type=\"text\" name=\"url\" style=\"width:
100%\"/>\n");
+ buf.append("<br />\n");
+ buf.append("<input type=\"submit\" name=\"connect\"
value=\"Connect\" />\n");
+ buf.append("</div>\n");
+ buf.append("</form>\n");
+
ctx.getPageMaker().makeTail(buf);
this.writeReply(ctx, 200, "text/html", "OK", buf.toString());
}
+ public void handlePost(URI uri, Bucket data, ToadletContext ctx) throws
ToadletContextClosedException, IOException, RedirectException {
+ if(data.size() > 1024*1024) {
+ this.writeReply(ctx, 400, "text/plain", "Too big", "Too
much data, darknet toadlet limited to 1MB");
+ return;
+ }
+ byte[] d = BucketTools.toByteArray(data);
+ String s = new String(d, "us-ascii");
+ HTTPRequest request;
+ try {
+ request = new HTTPRequest("/", s);
+ } catch (URISyntaxException e) {
+ Logger.error(this, "Impossible: "+e, e);
+ return;
+ }
+
+ if (request.getParam("connect").length() > 0) {
+ // connect to a new node
+ String urltext = request.getParam("url");
+ urltext = urltext.trim();
+ String reftext = request.getParam("ref");
+ reftext = reftext.trim();
+
+ String ref = new String("");
+
+ if (urltext.length() > 0) {
+ // fetch reference from a URL
+ try {
+ URL url = new URL(urltext);
+ URLConnection uc = url.openConnection();
+ BufferedReader in = new BufferedReader(
+ new
InputStreamReader(uc.getInputStream()));
+ String line;
+ while ( (line = in.readLine()) != null)
{
+ ref += line+"\n";
+ }
+ } catch (Exception e) {
+ this.sendErrorPage(ctx, 200, "Failed to
add node", "Unable to retrieve node reference from "+urltext+".");
+ }
+ } else if (reftext.length() > 0) {
+ // read directly from post data
+ // FIXME: The regexp don't work.
+ ref =
reftext.replaceAll("\\.*(\\w)\\=(\\w)(\\r?\\n)+", "\\1=\\2\\n");
+ } else {
+ this.sendErrorPage(ctx, 200, "Failed to add
node", "Could not detect either a node reference or a URL. Please <a
href=\".\">Try again</a>.");
+ return;
+ }
+ // we have a node reference in ref
+ SimpleFieldSet fs;
+
+ try {
+ fs = new SimpleFieldSet(ref, false);
+ } catch (IOException e) {
+ this.sendErrorPage(ctx, 200, "Failed to add
node", "Unable to parse the given text: <pre>"+reftext+"</pre> as a node
reference. Please <a href=\".\">Try again</a>.");
+ return;
+ }
+ PeerNode pn;
+ try {
+ pn = new PeerNode(fs, this.node);
+ } catch (FSParseException e1) {
+ this.sendErrorPage(ctx, 200, "Failed to add
node", "Unable to parse the given text: <pre>"+reftext+"</pre> as a node
reference. Please <a href=\".\">Try again</a>.");
+ return;
+ } catch (PeerParseException e1) {
+ this.sendErrorPage(ctx, 200, "Failed to add
node", "Unable to parse the given text: <pre>"+reftext+"</pre> as a node
reference. Please <a href=\".\">Try again</a>.");
+ return;
+ }
+ if(!this.node.addDarknetConnection(pn)) {
+ this.sendErrorPage(ctx, 200, "Failed to add
node", "Unable to add the given reference as a peer. Please <a href=\".\">Try
again</a>.");
+ }
+ }
+ this.handleGet(uri, ctx);
+ }
}
Modified:
trunk/freenet/src/freenet/clients/http/staticfiles/themes/aqua/theme.css
===================================================================
--- trunk/freenet/src/freenet/clients/http/staticfiles/themes/aqua/theme.css
2006-03-18 00:04:47 UTC (rev 8271)
+++ trunk/freenet/src/freenet/clients/http/staticfiles/themes/aqua/theme.css
2006-03-18 03:44:08 UTC (rev 8272)
@@ -57,10 +57,24 @@
.infobox {
border: 1px solid #5e88d8;
padding: 5px;
+ margin: 10px;
margin-bottom: 10px;
display: table-cell;
}
+pre, textarea {
+ font-size: 70%;
+}
+
+.boxhead {
+ text-align: left;
+ font-weight: bold;
+ margin: -5px;
+ margin-bottom: 10px;
+ border-bottom: 1px solid #5e88d8;
+ padding-left: 5px;
+}
+
#activity {
border: 1px solid #5e88d8;
padding: 5px;
Modified:
trunk/freenet/src/freenet/clients/http/staticfiles/themes/clean/theme.css
===================================================================
--- trunk/freenet/src/freenet/clients/http/staticfiles/themes/clean/theme.css
2006-03-18 00:04:47 UTC (rev 8271)
+++ trunk/freenet/src/freenet/clients/http/staticfiles/themes/clean/theme.css
2006-03-18 03:44:08 UTC (rev 8272)
@@ -48,6 +48,10 @@
float:left;
}
+pre, textarea {
+ font-size: 70%;
+}
+
.infobox {
margin:0 0 5px 0;
padding:10px;
@@ -64,6 +68,15 @@
font-size:13pt;
}
+.boxhead {
+ background-color:#e8e8e8;
+ text-align: left;
+ font-weight: bold;
+ margin: -10px;
+ margin-bottom: 10px;
+ padding-left: 5px;
+}
+
#activity {
margin:0 0 5px 0;
padding:10px;
Modified: trunk/freenet/src/freenet/node/Node.java
===================================================================
--- trunk/freenet/src/freenet/node/Node.java 2006-03-18 00:04:47 UTC (rev
8271)
+++ trunk/freenet/src/freenet/node/Node.java 2006-03-18 03:44:08 UTC (rev
8272)
@@ -2110,4 +2110,10 @@
public PeerNode[] getDarknetConnections() {
return peers.myPeers;
}
+
+ public boolean addDarknetConnection(PeerNode pn) {
+ boolean retval = peers.addPeer(pn);
+ peers.writePeers();
+ return retval;
+ }
}