Author: saces
Date: 2008-07-28 13:53:52 +0000 (Mon, 28 Jul 2008)
New Revision: 21445

Modified:
   trunk/freenet/src/freenet/clients/http/PproxyToadlet.java
   trunk/freenet/src/freenet/node/TextModeClientInterface.java
   trunk/freenet/src/freenet/pluginmanager/PluginManager.java
Log:
add install plugins from freenet uri

Modified: trunk/freenet/src/freenet/clients/http/PproxyToadlet.java
===================================================================
--- trunk/freenet/src/freenet/clients/http/PproxyToadlet.java   2008-07-28 
12:58:02 UTC (rev 21444)
+++ trunk/freenet/src/freenet/clients/http/PproxyToadlet.java   2008-07-28 
13:53:52 UTC (rev 21445)
@@ -118,19 +118,35 @@
                else
                {
                        PageMaker pageMaker = ctx.getPageMaker();
-
-                       if (request.isPartSet("submit-official") || 
request.isPartSet("submit-other")) {
+                       
+                       if (request.isPartSet("submit-official")) {
                                String pluginName = null;
-                               if (request.isPartSet("submit-official")) {
-                                       pluginName = 
request.getPartAsString("plugin-name", 40);
-                               } else {
-                                       pluginName = 
request.getPartAsString("plugin-url", 200);
-                               }
-                               pm.startPlugin(pluginName, true);
+                               pluginName = 
request.getPartAsString("plugin-name", 40);
+                               pm.startPluginOfficial(pluginName, true);
                                headers.put("Location", ".");
                                ctx.sendReplyHeaders(302, "Found", headers, 
null, 0);
                                return;
                        }
+                       if (request.isPartSet("submit-other")) {
+                               String pluginName = null;
+                               pluginName = 
request.getPartAsString("plugin-url", 200);
+                               boolean fileonly = 
"on".equalsIgnoreCase(request.getPartAsString("fileonly", 20));
+                               if (fileonly) 
+                                       pm.startPluginFile(pluginName, true);
+                               else
+                                       pm.startPluginURL(pluginName, true);
+                               headers.put("Location", ".");
+                               ctx.sendReplyHeaders(302, "Found", headers, 
null, 0);
+                               return;
+                       }
+                       if (request.isPartSet("submit-freenet")) {
+                               String pluginName = null;
+                               pluginName = 
request.getPartAsString("plugin-uri", 300);
+                               pm.startPluginFreenet(pluginName, true);
+                               headers.put("Location", ".");
+                               ctx.sendReplyHeaders(302, "Found", headers, 
null, 0);
+                               return;
+                       }
                        if (request.isPartSet("dismiss-user-alert")) {
                                int userAlertHashCode = 
request.getIntPart("disable", -1);
                                core.alerts.dismissAlert(userAlertHashCode);
@@ -211,7 +227,8 @@
                                        if (purge) {
                                                pm.removeCachedCopy(fn);
                                        }
-                                       pm.startPlugin(fn, true);
+                                       // FIXME
+                                       pm.startPluginAuto(fn, true);

                                        headers.put("Location", ".");
                                        ctx.sendReplyHeaders(302, "Found", 
headers, null, 0);
@@ -299,7 +316,7 @@
                                }

                                /* find which plugins have already been loaded. 
*/
-                               List/*<String>*/ availablePlugins = 
findAvailablePlugins();
+                               List<String> availablePlugins = 
pm.findAvailablePlugins();
                                Iterator/*<PluginInfoWrapper>*/ loadedPlugins = 
pm.getPlugins().iterator();
                                while (loadedPlugins.hasNext()) {
                                        PluginInfoWrapper pluginInfoWrapper = 
(PluginInfoWrapper) loadedPlugins.next();
@@ -317,6 +334,7 @@
                                showPluginList(ctx, pm, contentNode);
                                showOfficialPluginLoader(ctx, contentNode, 
availablePlugins);
                                showUnofficialPluginLoader(ctx, contentNode);
+                               showFreenetPluginLoader(ctx, contentNode);

                                writeHTMLReply(ctx, 200, "OK", 
pageNode.generate());
                        } else {
@@ -358,31 +376,6 @@
        }

        /**
-        * Returns a list of the names of all available official plugins. Right 
now
-        * this list is hardcoded but in future we could retrieve this list 
from emu
-        * or from freenet itself.
-        * 
-        * @return A list of all available plugin names
-        */
-       private List/* <String> */findAvailablePlugins() {
-               List/* <String> */availablePlugins = new ArrayList/* <String> 
*/();
-               availablePlugins.add("Echo");
-               availablePlugins.add("Freemail");
-               availablePlugins.add("HelloWorld");
-               availablePlugins.add("HelloFCP");
-               availablePlugins.add("JSTUN");
-               availablePlugins.add("KeyExplorer");
-               availablePlugins.add("MDNSDiscovery");
-               availablePlugins.add("SNMP");
-               availablePlugins.add("TestGallery");
-               availablePlugins.add("ThawIndexBrowser");
-               availablePlugins.add("UPnP");
-               availablePlugins.add("XMLLibrarian");
-               availablePlugins.add("XMLSpider");
-               return availablePlugins;
-       }
-
-       /**
         * Shows a list of all currently loading plugins.
         * 
         * @param pluginManager
@@ -489,6 +482,22 @@
                addOtherForm.addChild("input", new String[] { "type", "name", 
"size" }, new String[] { "text", "plugin-url", "80" });
                addOtherForm.addChild("#", " ");
                addOtherForm.addChild("input", new String[] { "type", "name", 
"value" }, new String[] { "submit", "submit-other", l10n("Load") });
+               addOtherForm.addChild("br");
+               addOtherForm.addChild("input", new String[] { "type", "name", 
"checked" }, new String[] { "checkbox", "fileonly", "checked" });
+               addOtherForm.addChild("#", " " + l10n("fileonly"));
        }
+       
+       private void showFreenetPluginLoader(ToadletContext toadletContext, 
HTMLNode contentNode) {
+               /* box for freenet plugins. */
+               HTMLNode addFreenetPluginBox = contentNode.addChild("div", 
"class", "infobox infobox-normal");
+               addFreenetPluginBox.addChild("div", "class", "infobox-header", 
l10n("loadFreenetPlugin"));
+               HTMLNode addFreenetPluginContent = 
addFreenetPluginBox.addChild("div", "class", "infobox-content");
+               HTMLNode addFreenetForm = 
toadletContext.addFormChild(addFreenetPluginContent, ".", 
"addFreenetPluginForm");
+               addFreenetForm.addChild("div", l10n("loadFreenetPluginText"));
+               addFreenetForm.addChild("#", (l10n("loadFreenetURLLabel") + ": 
"));
+               addFreenetForm.addChild("input", new String[] { "type", "name", 
"size" }, new String[] { "text", "plugin-uri", "80" });
+               addFreenetForm.addChild("#", " ");
+               addFreenetForm.addChild("input", new String[] { "type", "name", 
"value" }, new String[] { "submit", "submit-freenet", l10n("Load") });
+       }

 }

Modified: trunk/freenet/src/freenet/node/TextModeClientInterface.java
===================================================================
--- trunk/freenet/src/freenet/node/TextModeClientInterface.java 2008-07-28 
12:58:02 UTC (rev 21444)
+++ trunk/freenet/src/freenet/node/TextModeClientInterface.java 2008-07-28 
13:53:52 UTC (rev 21445)
@@ -899,14 +899,24 @@
                } else {
                        probeAll(Fields.parseInt(uline, 
NodeDispatcher.PROBE_TYPE_RESETTING_HTL));
                }
-        } else if(uline.startsWith("PLUGLOAD:")) {
-               if (line.substring("PLUGLOAD:".length()).trim().equals("?")) {
-                       outsb.append("  PLUGLOAD: pluginName         - Load 
official plugin from freenetproject.org\r\n");
-                       outsb.append("  PLUGLOAD: file://<filename>  - Load 
plugin from file\r\n");
-                       outsb.append("  PLUGLOAD: http://...         - Load 
plugin from online file\r\n");
+        } else if(uline.startsWith("PLUGLOAD")) {
+               if(uline.startsWith("PLUGLOAD:O:")) {
+                       String name = 
line.substring("PLUGLOAD:O:".length()).trim();
+                       n.pluginManager.startPluginOfficial(name, true);
+               } else if(uline.startsWith("PLUGLOAD:F:")) {
+                       String name = 
line.substring("PLUGLOAD:F:".length()).trim();
+                       n.pluginManager.startPluginFile(name, true);
+               } else if(uline.startsWith("PLUGLOAD:U:")) {
+                       String name = 
line.substring("PLUGLOAD:U:".length()).trim();
+                       n.pluginManager.startPluginURL(name, true);
+               } else if(uline.startsWith("PLUGLOAD:K:")) {
+                       String name = 
line.substring("PLUGLOAD:K:".length()).trim();
+                       n.pluginManager.startPluginFreenet(name, true);
                } else {
-                       String name = 
line.substring("PLUGLOAD:".length()).trim();
-                       n.pluginManager.startPlugin(name, true);
+                       outsb.append("  PLUGLOAD:O: pluginName         - Load 
official plugin from freenetproject.org\r\n");
+                       outsb.append("  PLUGLOAD:F: file://<filename>  - Load 
plugin from file\r\n");
+                       outsb.append("  PLUGLOAD:U: http://...         - Load 
plugin from online file\r\n");
+                       outsb.append("  PLUGLOAD:K: freenet key        - Load 
plugin from freenet uri\r\n");
                }
         } else if(uline.startsWith("PLUGLIST")) {
                outsb.append(n.pluginManager.dumpPlugins());

Modified: trunk/freenet/src/freenet/pluginmanager/PluginManager.java
===================================================================
--- trunk/freenet/src/freenet/pluginmanager/PluginManager.java  2008-07-28 
12:58:02 UTC (rev 21444)
+++ trunk/freenet/src/freenet/pluginmanager/PluginManager.java  2008-07-28 
13:53:52 UTC (rev 21445)
@@ -11,9 +11,11 @@
 import java.net.MalformedURLException;
 import java.net.URL;
 import java.net.URLConnection;
+import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Iterator;
+import java.util.List;
 import java.util.Set;
 import java.util.Vector;
 import java.util.jar.Attributes;
@@ -22,11 +24,14 @@
 import java.util.jar.Manifest;
 import java.util.zip.ZipException;

+import freenet.client.HighLevelSimpleClient;
 import freenet.config.InvalidConfigValueException;
 import freenet.config.SubConfig;
+import freenet.keys.FreenetURI;
 import freenet.l10n.L10n;
 import freenet.node.Node;
 import freenet.node.NodeClientCore;
+import freenet.node.RequestStarter;
 import freenet.node.Ticker;
 import freenet.node.useralerts.SimpleUserAlert;
 import freenet.node.useralerts.UserAlert;
@@ -34,6 +39,7 @@
 import freenet.support.Logger;
 import freenet.support.api.HTTPRequest;
 import freenet.support.api.StringArrCallback;
+import freenet.support.api.StringCallback;
 import freenet.support.io.Closer;
 import freenet.support.io.FileUtil;

@@ -49,6 +55,9 @@
         *
         */

+       private String configFile;
+       private String installDir;
+       
        private final HashMap toadletList;

        /* All currently starting plugins. */
@@ -59,15 +68,55 @@
        private final NodeClientCore core;
        SubConfig pmconfig;
        private boolean logMINOR;
+       private boolean logDEBUG;
+       private final HighLevelSimpleClient client;

        public PluginManager(Node node) {
+               
+               logMINOR = Logger.shouldLog(Logger.MINOR, this);
+               logDEBUG = Logger.shouldLog(Logger.DEBUG, this);
+               // config 
+               
                toadletList = new HashMap();
                pluginWrappers = new Vector();
                this.node = node;
                this.core = node.clientCore;
-               logMINOR = Logger.shouldLog(Logger.MINOR, this);
+               
+               if(logMINOR) Logger.minor(this, "Starting Plugin Manager");
+               
+               if(logDEBUG) Logger.debug(this, "Initialize Plugin Manager 
config");
+               
+               client = 
core.makeClient(RequestStarter.INTERACTIVE_PRIORITY_CLASS, true);
+               

                pmconfig = new SubConfig("pluginmanager", node.config);
+//             pmconfig.register("configfile", "fplugins.ini", 9, true, true, 
"PluginConfig.configFile", "PluginConfig.configFileLong",
+//                             new StringCallback() {
+//                     public String get() {
+//                             return configFile;
+//                     }
+//
+//                     public void set(String val) throws 
InvalidConfigValueException {
+//                             configFile = val;
+//                     }
+//             });
+//             configFile = pmconfig.getString("configfile");
+//             pmconfig.register("installdir", "fplugins", 9, true, true, 
"PluginConfig.installDir", "PluginConfig.installDirLong",
+//                             new StringCallback() {
+//                     public String get() {
+//                             return installDir;
+//                             //return getConfigLoadString();
+//                     }
+//
+//                     public void set(String val) throws 
InvalidConfigValueException {
+//                             installDir = val;
+//                             //if(storeDir.equals(new File(val))) return;
+//                             // FIXME
+//                             //throw new 
InvalidConfigValueException(L10n.getString("PluginManager.cannotSetOnceLoaded"));
+//                     }
+//             });
+//             installDir = pmconfig.getString("installdir");
+
                // Start plugins in the config
                pmconfig.register("loadplugin", null, 9, true, false, 
"PluginManager.loadedOnStartup", "PluginManager.loadedOnStartupLong",
                                new StringArrCallback() {
@@ -85,17 +134,10 @@
                String fns[] = pmconfig.getStringArr("loadplugin");
                if (fns != null) {
                        for (String name : fns)
-                               startPlugin(name, false);
+                               startPluginAuto(name, false);
                }

                pmconfig.finishedInitialization();
-               /*System.err.println("=================================");
-                 pmconfig.finishedInitialization();
-                 fns = pmconfig.getStringArr("loadplugin");
-                 for (int i = 0 ; i < fns.length ; i++)
-                 System.err.println("Load: " + StringArrOption.decode(fns[i]));
-                 System.err.println("=================================");
-                */
        }

        private String[] getConfigLoadString() {
@@ -126,8 +168,52 @@
                        return new HashSet/* <PluginProgress> 
*/(startingPlugins);
                }
        }
+       
+       
+       // try to guess around...
+       public void startPluginAuto(final String pluginname, boolean store) {
+               
+               if (isOfficialPlugin(pluginname)) {
+                       startPluginOfficial(pluginname, store);
+                       return;
+               }
+               
+               try {
+                       FreenetURI uri = new FreenetURI(pluginname);
+                       startPluginFreenet(pluginname, store);
+                       return;
+               } catch (MalformedURLException e) {
+                       // not a freenet key
+               }
+               
+               File[] roots = File.listRoots();
+               for (File f: roots) {
+                       if (pluginname.startsWith(f.getName())) {
+                               startPluginFile(pluginname, store);
+                               return;
+                       }
+               }

-       public void startPlugin(final String filename, final boolean store) {
+               startPluginURL(pluginname, store);
+       }
+       
+       public void startPluginOfficial(final String pluginname, boolean store) 
{
+               realStartPlugin(new PluginDownLoaderOfficial(), pluginname, 
store);
+       }
+       
+       public void startPluginFile(final String filename, boolean store) {
+               realStartPlugin(new PluginDownLoaderFile(), filename, store);
+       }
+       
+       public void startPluginURL(final String filename, boolean store) {
+               realStartPlugin(new PluginDownLoaderURL(), filename, store);
+       }
+       
+       public void startPluginFreenet(final String filename, boolean store) {
+               realStartPlugin(new PluginDownLoaderFreenet(client), filename, 
true);
+       }
+       
+       private void realStartPlugin(final PluginDownLoader pdl, final String 
filename, final boolean store) {
                if (filename.trim().length() == 0)
                        return;
                final PluginProgress pluginProgress = new 
PluginProgress(filename);
@@ -140,7 +226,7 @@
                                Logger.normal(this, "Loading plugin: " + 
filename);
                                FredPlugin plug;
                                try {
-                                       plug = loadPlugin(filename);
+                                       plug = loadPlugin(pdl, filename);
                                        
pluginProgress.setProgress(PluginProgress.STARTING);
                                        PluginInfoWrapper pi = 
PluginHandler.startPlugin(PluginManager.this, filename, plug, new 
PluginRespirator(node, PluginManager.this));
                                        synchronized (pluginWrappers) {
@@ -448,6 +534,40 @@
                        pi.stopPlugin(this, maxWaitTime);
                }
        }
+       
+       /**
+        * Returns a list of the names of all available official plugins. Right 
now
+        * this list is hardcoded but in future we could retrieve this list 
from emu
+        * or from freenet itself.
+        * 
+        * @return A list of all available plugin names
+        */
+       public List<String> findAvailablePlugins() {
+               List<String> availablePlugins = new ArrayList<String> ();
+               availablePlugins.add("Echo");
+               availablePlugins.add("Freemail");
+               availablePlugins.add("HelloWorld");
+               availablePlugins.add("HelloFCP");
+               availablePlugins.add("JSTUN");
+               availablePlugins.add("KeyExplorer");
+               availablePlugins.add("MDNSDiscovery");
+               availablePlugins.add("SNMP");
+               availablePlugins.add("TestGallery");
+               availablePlugins.add("ThawIndexBrowser");
+               availablePlugins.add("UPnP");
+               availablePlugins.add("XMLLibrarian");
+               availablePlugins.add("XMLSpider");
+               return availablePlugins;
+       }
+       
+       public boolean isOfficialPlugin(String name) {
+               if ((name == null) || name.trim().isEmpty()) return false;
+               List<String> availablePlugins = findAvailablePlugins();
+               for(String n:availablePlugins) {
+                       if (n.equals(name)) return true;                        
+               }
+               return false;
+       }

        /**
         * Tries to load a plugin from the given name. If the name only 
contains the
@@ -456,6 +576,7 @@
         * complete url and the short file already exists in the plugin 
directory
         * it's loaded from the plugin directory, otherwise it's retrieved from 
the
         * remote server.
+        * @param pdl 
         * 
         * @param name
         *            The specification of the plugin
@@ -463,32 +584,10 @@
         * @throws PluginNotFoundException
         *             If anything goes wrong.
         */
-       private FredPlugin loadPlugin(String name) throws 
PluginNotFoundException {
-               URL pluginUrl = null;
-               /* check if name is a local file. */
-               File pluginFile = new File(name);
-               if (pluginFile.exists() && pluginFile.isFile()) {
-                       try {
-                               pluginUrl = pluginFile.toURI().toURL();
-                       } catch (MalformedURLException e) {
-                               throw new PluginNotFoundException("can not 
convert local path");
-                       }
-               } else {
-                       /* check if name contains a URL. */
-                       try {
-                               pluginUrl = new URL(name);
-                       } catch (MalformedURLException mue1) {
-                       }
-               }
-               if (pluginUrl == null) {
-                       try {
-                               pluginUrl = new 
URL("http://downloads.freenetproject.org/alpha/plugins/"; + name + ".jar.url");
-                       } catch (MalformedURLException mue1) {
-                               Logger.error(this, "could not build plugin url 
for " + name, mue1);
-                               throw new PluginNotFoundException("could not 
build plugin url for " + name, mue1);
-                       }
-               }
-
+       private FredPlugin loadPlugin(PluginDownLoader pdl, String name) throws 
PluginNotFoundException {
+               
+               pdl.setSource(name);
+               
                /* check for plugin directory. */
                File pluginDirectory = new File(node.getNodeDir(), "plugins");
                if ((pluginDirectory.exists() && 
!pluginDirectory.isDirectory()) || (!pluginDirectory.exists() && 
!pluginDirectory.mkdirs())) {
@@ -497,14 +596,8 @@
                }

                /* get plugin filename. */
-               String completeFilename = pluginUrl.getPath();
-               String filename = 
completeFilename.substring(completeFilename.lastIndexOf('/') + 1);
-               // The URL to the JAR file might end with .url because of the 
insane download server that redirects to a JAR file
-               // in response to a request for a file ending '.url'. Strip it 
off if so, since we want our JAR to end with '.jar'.
-               if (filename.endsWith(".url")) {
-                       filename = filename.substring(0, filename.length() - 4);
-               }
-               pluginFile = new File(pluginDirectory, filename);
+               String filename = pdl.getPluginName(name);
+               File pluginFile = new File(pluginDirectory, filename);

                /* check if file needs to be downloaded. */
                if (logMINOR) {
@@ -516,16 +609,14 @@
                                try {
                                        File tempPluginFile = null;
                                        OutputStream pluginOutputStream = null;
-                                       URLConnection urlConnection = null;
                                        InputStream pluginInputStream = null;
                                        try {
                                                tempPluginFile = 
File.createTempFile("plugin-", ".jar", pluginDirectory);
+                                               tempPluginFile.deleteOnExit();
+                                               
+                                               
                                                pluginOutputStream = new 
FileOutputStream(tempPluginFile);
-                                               urlConnection = 
pluginUrl.openConnection();
-                                               
urlConnection.setUseCaches(false);
-                                               
urlConnection.setAllowUserInteraction(false);
-                                               urlConnection.connect();
-                                               pluginInputStream = 
urlConnection.getInputStream();
+                                               pluginInputStream = 
pdl.getInputStream();
                                                byte[] buffer = new byte[1024];
                                                int read;
                                                while ((read = 
pluginInputStream.read(buffer)) != -1) {


Reply via email to