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


Reply via email to