Author: nextgens
Date: 2006-05-18 13:30:59 +0000 (Thu, 18 May 2006)
New Revision: 8764

Added:
   trunk/freenet/src/freenet/clients/http/PproxyToadlet.java
Removed:
   trunk/freenet/src/freenet/pluginmanager/PproxyToadlet.java
Modified:
   trunk/freenet/src/freenet/clients/http/FproxyToadlet.java
Log:
resolves https://bugs.freenetproject.org/view.php?id=299

        * Move the PluginToadlet where it should be
        * Implement POSTs insteed of GETs

I doubt that Jogy will find my form buttons nice. :/ The CSS needs some 
tweaking.
see https://bugs.freenetproject.org/view.php?id=275 if you'd like to fix it.

Modified: trunk/freenet/src/freenet/clients/http/FproxyToadlet.java
===================================================================
--- trunk/freenet/src/freenet/clients/http/FproxyToadlet.java   2006-05-18 
12:59:53 UTC (rev 8763)
+++ trunk/freenet/src/freenet/clients/http/FproxyToadlet.java   2006-05-18 
13:30:59 UTC (rev 8764)
@@ -22,7 +22,6 @@
 import freenet.keys.FreenetURI;
 import freenet.node.Node;
 import freenet.node.RequestStarter;
-import freenet.pluginmanager.PproxyToadlet;
 import freenet.support.Base64;
 import freenet.support.Bucket;
 import freenet.support.HTMLEncoder;

Copied: trunk/freenet/src/freenet/clients/http/PproxyToadlet.java (from rev 
8756, trunk/freenet/src/freenet/pluginmanager/PproxyToadlet.java)
===================================================================
--- trunk/freenet/src/freenet/pluginmanager/PproxyToadlet.java  2006-05-18 
04:49:13 UTC (rev 8756)
+++ trunk/freenet/src/freenet/clients/http/PproxyToadlet.java   2006-05-18 
13:30:59 UTC (rev 8764)
@@ -0,0 +1,237 @@
+package freenet.clients.http;
+
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.Date;
+import java.util.Iterator;
+
+import freenet.client.HighLevelSimpleClient;
+import freenet.pluginmanager.PluginHTTPException;
+import freenet.pluginmanager.PluginInfoWrapper;
+import freenet.pluginmanager.PluginManager;
+import freenet.support.Bucket;
+import freenet.support.BucketTools;
+import freenet.support.Logger;
+import freenet.support.MultiValueTable;
+
+public class PproxyToadlet extends Toadlet {
+       private PluginManager pm = null;
+
+       public PproxyToadlet(HighLevelSimpleClient client, PluginManager pm) {
+               super(client);
+               this.pm = pm;
+       }
+       
+       public String supportedMethods() {
+               return "GET, POST";
+       }
+
+       public void handlePost(URI uri, Bucket data, ToadletContext ctx)
+               throws ToadletContextClosedException, IOException {
+               
+               if(data.size() > 1024*1024) {
+                       this.writeReply(ctx, 400, "text/plain", "Too big", "Too 
much data, config servlet 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;
+               }
+               
+               StringBuffer buf = new StringBuffer();
+               MultiValueTable headers = new MultiValueTable();
+               
+               if (request.isParameterSet("load")) {
+                       pm.startPlugin(request.getParam("load"));
+                       //writeReply(ctx, 200, "text/html", "OK", 
mkForwardPage("Loading plugin", "Loading plugin...", ".", 5));
+       
+                       headers.put("Location", ".");
+                       ctx.sendReplyHeaders(302, "Found", headers, null, 0);
+                       return;
+               }if (request.isParameterSet("cancel")){
+                       headers.put("Location", "/plugins/");
+                       ctx.sendReplyHeaders(302, "Found", headers, null, 0);
+                       return;
+               }if (request.getParam("unloadconfirm").length() > 0) {
+                       pm.killPlugin(request.getParam("unloadconfirm"));
+                       ctx.getPageMaker().makeHead(buf, "Plugins");
+                       buf.append("<div class=\"infobox 
infobox-information\">\n");
+                       buf.append("<div class=\"infobox-header\">\n");
+                       buf.append("Plugin operation\n");
+                       buf.append("</div>\n");
+                       buf.append("<div class=\"infobox-content\">\n");
+                       buf.append("The plugin "+request.getParam("remove")+" 
has been removed.\n");
+                       buf.append("<a href=\"/plugins/\">Back</a>");
+                       buf.append("</div>\n");
+                       buf.append("</div>\n");
+                       ctx.getPageMaker().makeTail(buf);
+                               
+                       writeReply(ctx, 200, "text/html", "OK", buf.toString());
+                       return;
+               }if (request.getParam("unload").length() > 0) {
+                       ctx.getPageMaker().makeHead(buf, "Plugins");
+                       buf.append("<div class=\"infobox infobox-query\">\n");
+                       buf.append("<div class=\"infobox-header\">\n");
+                       buf.append("Plugin operation\n");
+                       buf.append("</div>\n");
+                       buf.append("<div class=\"infobox-content\">\n");
+                       buf.append("Are you sure you wish to unload 
"+request.getParam("unload")+"?\n");
+                       buf.append("<form action=\"/plugins/\" 
method=\"post\">\n");
+                       buf.append("<input type=\"submit\" name=\"cancel\" 
value=\"Cancel\" />\n");
+                       buf.append("</form>");
+                       buf.append("<form action=\"/plugins/\" 
method=\"post\">\n");
+                       buf.append("<input type=\"hidden\" 
name=\"unloadconfirm\" value=\""+request.getParam("unload")+"\">\n");
+                       buf.append("<input type=\"submit\" name=\"confirm\" 
value=\"UNLOAD\" />\n");
+                       buf.append("</form>\n");
+                       buf.append("</div>\n");
+                       buf.append("</div>\n");
+                       ctx.getPageMaker().makeTail(buf);
+                       writeReply(ctx, 200, "text/html", "OK", buf.toString());
+                       return;
+               }else if (request.getParam("reload").length() > 0) {
+                       String fn = null;
+                       Iterator it = pm.getPlugins().iterator();
+                       while (it.hasNext()) {
+                               PluginInfoWrapper pi = (PluginInfoWrapper) 
it.next();
+                               if 
(pi.getThreadName().equals(request.getParam("reload"))) {
+                                       fn = pi.getFilename();
+                                       break;
+                               }
+                       }
+                       
+                       if (fn == null) {
+                               this.sendErrorPage(ctx, 404, "Plugin not 
found", "The specified plugin could not be located in order to reload it.");
+                               //writeReply(ctx, 200, "text/html", "OK", 
mkForwardPage(ctx,"Error", "Plugin not found...", ".", 5));
+                       } else {
+                               pm.killPlugin(request.getParam("reload"));
+                               pm.startPlugin(fn);
+                               
+                               headers.put("Location", ".");
+                               ctx.sendReplyHeaders(302, "Found", headers, 
null, 0);
+                       }
+                       return;
+               }else {
+                       // Ignore
+                       headers.put("Location", ".");
+                       ctx.sendReplyHeaders(302, "Found", headers, null, 0);
+               }
+
+       }
+       
+       public void handleGet(URI uri, ToadletContext ctx)
+                       throws ToadletContextClosedException, IOException {
+               //String basepath = "/plugins/";
+               HTTPRequest request = new HTTPRequest(uri);
+               String path = request.getPath();
+
+               // remove leading / and 'plugins/' from path
+               if(path.startsWith("/"))
+                       path = path.substring(1);
+               path = path.substring("plugins/".length());
+               Logger.minor(this, "Pproxy fetching "+path);
+               try {
+                       if (path.equals("")) {
+                               this.showPluginList(ctx, request);
+                       } else {
+                               // split path into plugin class name and 'data' 
path for plugin
+                               int to = path.indexOf("/");
+                               String plugin, data;
+                               if (to == -1) {
+                                       plugin = path;
+                                       data = "";
+                               } else {
+                                       plugin = path.substring(0, to);
+                                       data = path.substring(to + 1);
+                               }
+                               
+                               //pm.handleHTTPGet(plugin, data);
+                               
+                               // create a new request with the 'data' path 
and pass it to the plugin 
+                               request = new HTTPRequest(data, 
uri.getRawQuery());
+                               //writeReply(ctx, 200, "text/html", "OK", 
mkPage("plugin", pm.handleHTTPGet(plugin, data)));
+                               writeReply(ctx, 200, "text/html", "OK", 
pm.handleHTTPGet(plugin, request));
+
+                               
+                       }
+                       
+                       //FetchResult result = fetch(key);
+                       //writeReply(ctx, 200, result.getMimeType(), "OK", 
result.asBucket());
+                       
+               } catch (PluginHTTPException ex) {
+                       // TODO: make it into html
+                       writeReply(ctx, ex.getCode(), ex.getMimeType(), 
ex.getDesc(), ex.getReply());
+               } catch (Throwable t) {
+                       Logger.error(this, "Caught "+t, t);
+                       String msg = "<html><head><title>Internal 
Error</title></head><body><h1>Internal Error: please report</h1><pre>";
+                       StringWriter sw = new StringWriter();
+                       PrintWriter pw = new PrintWriter(sw);
+                       t.printStackTrace(pw);
+                       pw.flush();
+                       msg = msg + sw.toString() + "</pre></body></html>";
+                       this.writeReply(ctx, 500, "text/html", "Internal 
Error", msg);
+               }
+       }
+
+       private void showPluginList(ToadletContext ctx, HTTPRequest request) 
throws ToadletContextClosedException, IOException {
+               if (!request.hasParameters()) {
+                       StringBuffer out = new StringBuffer();
+                       ctx.getPageMaker().makeHead(out, "Plugin List");
+                       out.append("<table style=\"border: 1pt solid 
#c0c0c0;\">");
+                       out.append("  <tr>\n");
+                       out.append("    <th>Name</th>\n");
+                       out.append("    <th>ID</th>\n");
+                       out.append("    <th>Started</th>\n");
+                       out.append("    <th></th>\n");
+                       out.append("  </tr>\n");
+                       Iterator it = pm.getPlugins().iterator();
+                       while (it.hasNext()) {
+                               PluginInfoWrapper pi = (PluginInfoWrapper) 
it.next();
+                               out.append("  <tr>\n");
+                               out.append("    <td style=\"border: 1pt solid 
#c0c0c0;\">" + pi.getPluginClassName() + "</td>\n");
+                               out.append("    <td style=\"border: 1pt solid 
#c0c0c0;\">" + pi.getThreadName() + "</td>\n");
+                               out.append("    <td style=\"border: 1pt solid 
#c0c0c0;\">" + (new Date(pi.getStarted())) + "</td>\n");
+                               out.append("    <td style=\"border: 1pt solid 
#c0c0c0;\">");
+                               if (pi.isPproxyPlugin())
+                                       out.append("&nbsp;<a 
href=\""+pi.getPluginClassName()+"/\">[VISIT]</a>&nbsp;");
+                               out.append("&nbsp;<form method=\"post\" 
action=\".\">" +
+                                               "<input type=\"hidden\" 
name=\"unload\" value=\""+pi.getThreadName()+"\" />"+
+                                               "<input type=\"submit\" 
value=\"[UNLOAD]\"></form>&nbsp;");
+                               out.append("&nbsp;<form method=\"post\" 
action=\".\">" +
+                                               "<input type=\"hidden\" 
name=\"reload\" value=\""+pi.getThreadName()+"\" />"+
+                                               "<input type=\"submit\" 
value=\"[RELOAD]\"></form>&nbsp;");
+                               out.append("</td>\n");
+                               out.append("  </tr>\n");
+                       }
+                       
+                       if (pm.getPlugins().isEmpty()) {
+                               out.append("<tr>\n");
+                               out.append("<td colspan=\"4\"\n");
+                               out.append("<i>No plugins loaded</i>\n");
+                               out.append("</td>\n");
+                               out.append("</tr>\n");
+                       }
+                       
+                       out.append("</table>");
+                       //String ret = "<hr/>" + out.toString();
+                       //ret = pm.dumpPlugins().replaceAll(",", "\n&nbsp; 
&nbsp; ").replaceAll("\"", " \" ");
+                       /*if (ret.length() < 6)
+                               ret += "<i>No plugins loaded</i>\n";
+                       ret += "<hr/>";*/
+                       
+                       
+                       // Obsolete
+                       //out.append("<form method=\"get\"><div>Remove plugin: 
(enter ID) <input type=\"text\" name=\"remove\" size=40/><input type=\"submit\" 
value=\"Remove\"/></div></form>\n");
+                       out.append("<form method=\"post\" 
action=\".\"><div>Load plugin: <input type=\"text\" name=\"load\" 
size=\"40\"/><input type=\"submit\" value=\"Load\" /></div></form>\n");
+                       ctx.getPageMaker().makeTail(out);
+                       writeReply(ctx, 200, "text/html", "OK", out.toString());
+               } 
+       }
+}

Deleted: trunk/freenet/src/freenet/pluginmanager/PproxyToadlet.java
===================================================================
--- trunk/freenet/src/freenet/pluginmanager/PproxyToadlet.java  2006-05-18 
12:59:53 UTC (rev 8763)
+++ trunk/freenet/src/freenet/pluginmanager/PproxyToadlet.java  2006-05-18 
13:30:59 UTC (rev 8764)
@@ -1,200 +0,0 @@
-package freenet.pluginmanager;
-
-import java.io.IOException;
-import java.io.PrintWriter;
-import java.io.StringWriter;
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.util.Date;
-import java.util.Iterator;
-
-import freenet.client.HighLevelSimpleClient;
-import freenet.clients.http.HTTPRequest;
-import freenet.clients.http.Toadlet;
-import freenet.clients.http.ToadletContext;
-import freenet.clients.http.ToadletContextClosedException;
-import freenet.support.Bucket;
-import freenet.support.BucketTools;
-import freenet.support.Logger;
-import freenet.support.MultiValueTable;
-
-public class PproxyToadlet extends Toadlet {
-       private PluginManager pm = null;
-
-       public PproxyToadlet(HighLevelSimpleClient client, PluginManager pm) {
-               super(client);
-               this.pm = pm;
-       }
-       
-       public String supportedMethods() {
-               return "GET, POST";
-       }
-
-       public void handlePost(URI uri, Bucket data, ToadletContext ctx)
-               throws ToadletContextClosedException, IOException {
-               
-               if(data.size() > 1024*1024) {
-                       this.writeReply(ctx, 400, "text/plain", "Too big", "Too 
much data, config servlet 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.isParameterSet("load")) {
-                       pm.startPlugin(request.getParam("load"));
-                       //writeReply(ctx, 200, "text/html", "OK", 
mkForwardPage("Loading plugin", "Loading plugin...", ".", 5));
-                       MultiValueTable headers = new MultiValueTable();
-                       
-                       headers.put("Location", ".");
-                       ctx.sendReplyHeaders(302, "Found", headers, null, 0);
-               } else {
-                       // Ignore
-                       MultiValueTable headers = new MultiValueTable();
-                       headers.put("Location", ".");
-                       ctx.sendReplyHeaders(302, "Found", headers, null, 0);
-               }
-
-       }
-       
-       public void handleGet(URI uri, ToadletContext ctx)
-                       throws ToadletContextClosedException, IOException {
-               //String basepath = "/plugins/";
-               HTTPRequest request = new HTTPRequest(uri);
-               String path = request.getPath();
-
-               // remove leading / and 'plugins/' from path
-               if(path.startsWith("/"))
-                       path = path.substring(1);
-               path = path.substring("plugins/".length());
-               Logger.minor(this, "Pproxy fetching "+path);
-               try {
-                       if (path.equals("")) {
-                               this.showPluginList(ctx, request);
-                       } else {
-                               // split path into plugin class name and 'data' 
path for plugin
-                               int to = path.indexOf("/");
-                               String plugin, data;
-                               if (to == -1) {
-                                       plugin = path;
-                                       data = "";
-                               } else {
-                                       plugin = path.substring(0, to);
-                                       data = path.substring(to + 1);
-                               }
-                               
-                               //pm.handleHTTPGet(plugin, data);
-                               
-                               // create a new request with the 'data' path 
and pass it to the plugin 
-                               request = new HTTPRequest(data, 
uri.getRawQuery());
-                               //writeReply(ctx, 200, "text/html", "OK", 
mkPage("plugin", pm.handleHTTPGet(plugin, data)));
-                               writeReply(ctx, 200, "text/html", "OK", 
pm.handleHTTPGet(plugin, request));
-
-                               
-                       }
-                       
-                       //FetchResult result = fetch(key);
-                       //writeReply(ctx, 200, result.getMimeType(), "OK", 
result.asBucket());
-                       
-               } catch (PluginHTTPException ex) {
-                       // TODO: make it into html
-                       writeReply(ctx, ex.getCode(), ex.getMimeType(), 
ex.getDesc(), ex.getReply());
-               } catch (Throwable t) {
-                       Logger.error(this, "Caught "+t, t);
-                       String msg = "<html><head><title>Internal 
Error</title></head><body><h1>Internal Error: please report</h1><pre>";
-                       StringWriter sw = new StringWriter();
-                       PrintWriter pw = new PrintWriter(sw);
-                       t.printStackTrace(pw);
-                       pw.flush();
-                       msg = msg + sw.toString() + "</pre></body></html>";
-                       this.writeReply(ctx, 500, "text/html", "Internal 
Error", msg);
-               }
-       }
-
-       private void showPluginList(ToadletContext ctx, HTTPRequest request) 
throws ToadletContextClosedException, IOException {
-               if (!request.hasParameters()) {
-                       StringBuffer out = new StringBuffer();
-                       ctx.getPageMaker().makeHead(out, "Plugin List");
-                       out.append("<table style=\"border: 1pt solid 
#c0c0c0;\">");
-                       out.append("  <tr>\n");
-                       out.append("    <th>Name</th>\n");
-                       out.append("    <th>ID</th>\n");
-                       out.append("    <th>Started</th>\n");
-                       out.append("    <th></th>\n");
-                       out.append("  </tr>\n");
-                       Iterator it = pm.getPlugins().iterator();
-                       while (it.hasNext()) {
-                               PluginInfoWrapper pi = (PluginInfoWrapper) 
it.next();
-                               out.append("  <tr>\n");
-                               out.append("    <td style=\"border: 1pt solid 
#c0c0c0;\">" + pi.getPluginClassName() + "</td>\n");
-                               out.append("    <td style=\"border: 1pt solid 
#c0c0c0;\">" + pi.getThreadName() + "</td>\n");
-                               out.append("    <td style=\"border: 1pt solid 
#c0c0c0;\">" + (new Date(pi.getStarted())) + "</td>\n");
-                               out.append("    <td style=\"border: 1pt solid 
#c0c0c0;\">");
-                               if (pi.isPproxyPlugin())
-                                       out.append("&nbsp;<a 
href=\""+pi.getPluginClassName()+"/\">[VISIT]</a>&nbsp;");
-                               out.append("&nbsp;<a 
href=\"?remove="+pi.getThreadName()+"\">[UNLOAD]</a>&nbsp;");
-                               out.append("&nbsp;<a 
href=\"?reload="+pi.getThreadName()+"\">[RELOAD]</a>&nbsp;");
-                               out.append("</td>\n");
-                               out.append("  </tr>\n");
-                       }
-                       
-                       if (pm.getPlugins().isEmpty()) {
-                               out.append("<tr>\n");
-                               out.append("<td colspan=\"4\"\n");
-                               out.append("<i>No plugins loaded</i>\n");
-                               out.append("</td>\n");
-                               out.append("</tr>\n");
-                       }
-                       
-                       out.append("</table>");
-                       //String ret = "<hr/>" + out.toString();
-                       //ret = pm.dumpPlugins().replaceAll(",", "\n&nbsp; 
&nbsp; ").replaceAll("\"", " \" ");
-                       /*if (ret.length() < 6)
-                               ret += "<i>No plugins loaded</i>\n";
-                       ret += "<hr/>";*/
-                       
-                       
-                       // Obsolete
-                       //out.append("<form method=\"get\"><div>Remove plugin: 
(enter ID) <input type=\"text\" name=\"remove\" size=40/><input type=\"submit\" 
value=\"Remove\"/></div></form>\n");
-                       out.append("<form method=\"post\" 
action=\".\"><div>Load plugin: <input type=\"text\" name=\"load\" 
size=\"40\"/><input type=\"submit\" value=\"Load\" /></div></form>\n");
-                       ctx.getPageMaker().makeTail(out);
-                       writeReply(ctx, 200, "text/html", "OK", out.toString());
-               } else if (request.isParameterSet("remove")) {
-                       pm.killPlugin(request.getParam("remove"));
-                       
-                       MultiValueTable headers = new MultiValueTable();
-                       
-                       headers.put("Location", ".");
-                       ctx.sendReplyHeaders(302, "Found", headers, null, 0);
-                       //writeReply(ctx, 200, "text/html", "OK", 
mkForwardPage("Removing plugin", "Removing plugin...", ".", 5));
-               } else if (request.isParameterSet("reload")) {
-                       String fn = null;
-                       Iterator it = pm.getPlugins().iterator();
-                       while (it.hasNext()) {
-                               PluginInfoWrapper pi = (PluginInfoWrapper) 
it.next();
-                               if 
(pi.getThreadName().equals(request.getParam("reload"))) {
-                                       fn = pi.getFilename();
-                                       break;
-                               }
-                       }
-                       
-                       if (fn == null) {
-                               this.sendErrorPage(ctx, 404, "Plugin not 
found", "The specified plugin could not be located in order to reload it.");
-                               //writeReply(ctx, 200, "text/html", "OK", 
mkForwardPage(ctx,"Error", "Plugin not found...", ".", 5));
-                       } else {
-                               pm.killPlugin(request.getParam("reload"));
-                               pm.startPlugin(fn);
-                               
-                               MultiValueTable headers = new MultiValueTable();
-                               headers.put("Location", ".");
-                               ctx.sendReplyHeaders(302, "Found", headers, 
null, 0);
-                       }
-               }
-       }
-}


Reply via email to