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(" <a href=\""+pi.getPluginClassName()+"/\">[VISIT]</a> "); + out.append(" <form method=\"post\" action=\".\">" + + "<input type=\"hidden\" name=\"unload\" value=\""+pi.getThreadName()+"\" />"+ + "<input type=\"submit\" value=\"[UNLOAD]\"></form> "); + out.append(" <form method=\"post\" action=\".\">" + + "<input type=\"hidden\" name=\"reload\" value=\""+pi.getThreadName()+"\" />"+ + "<input type=\"submit\" value=\"[RELOAD]\"></form> "); + 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 ").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(" <a href=\""+pi.getPluginClassName()+"/\">[VISIT]</a> "); - out.append(" <a href=\"?remove="+pi.getThreadName()+"\">[UNLOAD]</a> "); - out.append(" <a href=\"?reload="+pi.getThreadName()+"\">[RELOAD]</a> "); - 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 ").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); - } - } - } -}
