diff --git a/src/freenet/clients/fcp/LoadPlugin.java b/src/freenet/clients/fcp/LoadPlugin.java index 4b5ae675e04..31e3b41958f 100644 --- a/src/freenet/clients/fcp/LoadPlugin.java +++ b/src/freenet/clients/fcp/LoadPlugin.java @@ -117,7 +117,8 @@ public void run() { pi = node.getPluginManager().startPluginFreenet(pluginURL, store); break; case TYPENAME_URL: - pi = node.getPluginManager().startPluginURL(pluginURL, store); + // only support Hyphanet URLs, because others are a privacy risk + pi = node.getPluginManager().startPluginFreenet(pluginURL, store); break; default: Logger.error(this, "This should really not happen!", new Exception("FIXME")); diff --git a/src/freenet/clients/http/PproxyToadlet.java b/src/freenet/clients/http/PproxyToadlet.java index 9f945bc447c..e02ef3992c0 100644 --- a/src/freenet/clients/http/PproxyToadlet.java +++ b/src/freenet/clients/http/PproxyToadlet.java @@ -14,6 +14,7 @@ import java.util.List; import java.util.Map; import java.util.Map.Entry; +import java.util.Objects; import java.util.Set; import java.util.SortedMap; import java.util.TreeMap; @@ -26,9 +27,11 @@ import freenet.pluginmanager.DownloadPluginHTTPException; import freenet.pluginmanager.NotFoundPluginHTTPException; import freenet.pluginmanager.OfficialPlugins.OfficialPluginDescription; +import freenet.pluginmanager.PluginDownLoaderFile; import freenet.pluginmanager.PluginHTTPException; import freenet.pluginmanager.PluginInfoWrapper; import freenet.pluginmanager.PluginManager; +import freenet.pluginmanager.PluginNotFoundException; import freenet.pluginmanager.RedirectPluginHTTPException; import freenet.pluginmanager.PluginManager.PluginProgress; import freenet.support.HTMLNode; @@ -156,10 +159,19 @@ public void run() { node.getExecutor().execute(new Runnable() { @Override public void run() { - if (fileonly) + if (fileonly) { pm.startPluginFile(pluginName, true); - else - pm.startPluginURL(pluginName, true); + } else { + // first check whether it is a file + for(File f : File.listRoots()) { + if(!Objects.equals(f.getName(), "") && pluginName.startsWith(f.getName()) + || pluginName.startsWith(f.getPath())) { + pm.startPluginFile(pluginName, true); + return; + } + } + pm.startPluginFreenet(pluginName, true); + } } }); diff --git a/src/freenet/node/TextModeClientInterface.java b/src/freenet/node/TextModeClientInterface.java index 20a22541a25..0ea531d4397 100644 --- a/src/freenet/node/TextModeClientInterface.java +++ b/src/freenet/node/TextModeClientInterface.java @@ -939,7 +939,8 @@ else if(uline.startsWith("PUTSSKDIR:")) { n.getPluginManager().startPluginFile(name, true); } else if(uline.startsWith("PLUGLOAD:U:")) { String name = line.substring("PLUGLOAD:U:".length()).trim(); - n.getPluginManager().startPluginURL(name, true); + // only support Hyphanet URLs, because others are a privacy risk + n.getPluginManager().startPluginFreenet(name, true); } else if(uline.startsWith("PLUGLOAD:K:")) { String name = line.substring("PLUGLOAD:K:".length()).trim(); n.getPluginManager().startPluginFreenet(name, true); diff --git a/src/freenet/pluginmanager/PluginDownLoaderURL.java b/src/freenet/pluginmanager/PluginDownLoaderURL.java deleted file mode 100644 index c9c530d4f0c..00000000000 --- a/src/freenet/pluginmanager/PluginDownLoaderURL.java +++ /dev/null @@ -1,117 +0,0 @@ -/* This code is part of Freenet. It is distributed under the GNU General - * Public License, version 2 (or at your option any later version). See - * http://www.gnu.org/ for further details of the GPL. */ -package freenet.pluginmanager; - -import java.io.File; -import java.io.IOException; -import java.io.InputStream; -import java.net.HttpURLConnection; -import java.net.MalformedURLException; -import java.net.URL; -import java.net.URLConnection; - -import freenet.pluginmanager.PluginManager.PluginProgress; -import freenet.support.Logger; - -public class PluginDownLoaderURL extends PluginDownLoader { - - @Override - public URL checkSource(String source) throws PluginNotFoundException { - try { - return new URL(source); - } catch (MalformedURLException e) { - // Generate a meaningful error message when file not found falls back to a URL. - // Maybe it's a file? - // If we've reached this point then it doesn't exist. - File[] roots = File.listRoots(); - for(File f : roots) { - if(source.startsWith(f.getName()) && !new File(source).exists()) { - throw new PluginNotFoundException("File not found: "+source); - } - } - - Logger.error(this, "could not build plugin url for " + source, e); - throw new PluginNotFoundException("could not build plugin url for " + source, e); - } - } - - @Override - InputStream getInputStream(PluginProgress progress) throws IOException { - URLConnection urlConnection = getSource().openConnection(); - urlConnection.setUseCaches(false); - urlConnection.setAllowUserInteraction(false); - //urlConnection.connect(); - return openConnectionCheckRedirects(urlConnection); - } - - @Override - String getPluginName(String source) throws PluginNotFoundException { - String name = source.substring(source.lastIndexOf('/') + 1); - if (name.endsWith(".url")) { - name = name.substring(0, name.length() - 4); - } - return name; - } - - @Override - String getSHA1sum() throws PluginNotFoundException { - return null; - } - - static InputStream openConnectionCheckRedirects(URLConnection c) throws IOException - { - boolean redir; - int redirects = 0; - InputStream in = null; - do - { - if (c instanceof HttpURLConnection) - { - ((HttpURLConnection) c).setInstanceFollowRedirects(false); - } - // We want to open the input stream before getting headers - // because getHeaderField() et al swallow IOExceptions. - in = c.getInputStream(); - redir = false; - if (c instanceof HttpURLConnection) - { - HttpURLConnection http = (HttpURLConnection) c; - int stat = http.getResponseCode(); - if (stat >= 300 && stat <= 307 && stat != 306 && - stat != HttpURLConnection.HTTP_NOT_MODIFIED) - { - URL base = http.getURL(); - String loc = http.getHeaderField("Location"); - URL target = null; - if (loc != null) - { - target = new URL(base, loc); - } - http.disconnect(); - // Redirection should be allowed only for HTTP and HTTPS - // and should be limited to 5 redirections at most. - if (target == null || !(target.getProtocol().equals("http") - || target.getProtocol().equals("https") - || target.getProtocol().equals("ftp")) - || redirects >= 5) - { - throw new SecurityException("illegal URL redirect"); - } - redir = true; - c = target.openConnection(); - redirects++; - in.close(); - } - } - } - while (redir); - return in; - } - - @Override - void tryCancel() { - // Do nothing, not supported. - } -} - diff --git a/src/freenet/pluginmanager/PluginManager.java b/src/freenet/pluginmanager/PluginManager.java index 8e520d580ff..f9dfcd260f3 100644 --- a/src/freenet/pluginmanager/PluginManager.java +++ b/src/freenet/pluginmanager/PluginManager.java @@ -321,7 +321,9 @@ public PluginInfoWrapper startPluginAuto(final String pluginname, boolean store) } } - return startPluginURL(pluginname, store); + Logger.debug(this, "Plugin only has a clearnet URL source. Not loading it for safeties sake: " + pluginname); + // causes a NoSuchPlugin error in ReloadPlugin.java + return null; } public PluginInfoWrapper startPluginOfficial(final String pluginname, boolean store) { @@ -359,8 +361,13 @@ public PluginInfoWrapper startPluginFile(final String filename, boolean store) { return realStartPlugin(new PluginDownLoaderFile(), filename, store, false); } + /** + * @deprecated this is unused -- keeping it to avoid removing public API that may be in use by plugins + */ + @Deprecated public PluginInfoWrapper startPluginURL(final String filename, boolean store) { - return realStartPlugin(new PluginDownLoaderURL(), filename, store, false); + Logger.warning(this, "Tried to download plugin from clearnet URL, but that is removed. Interpreting as FreenetURI instead."); + return startPluginFreenet(filename, store); } public PluginInfoWrapper startPluginFreenet(final String filename, boolean store) {