Author: toad
Date: 2009-01-06 21:34:01 +0000 (Tue, 06 Jan 2009)
New Revision: 24940

Modified:
   trunk/freenet/src/freenet/clients/http/FProxyToadlet.java
   trunk/freenet/src/freenet/clients/http/StaticToadlet.java
   trunk/freenet/src/freenet/clients/http/filter/ContentFilter.java
   trunk/freenet/src/freenet/clients/http/filter/GenericReadFilterCallback.java
   trunk/freenet/src/freenet/clients/http/filter/PNGFilter.java
   trunk/freenet/src/freenet/node/NodeClientCore.java
   trunk/freenet/src/freenet/node/TextModeClientInterface.java
   trunk/freenet/src/freenet/pluginmanager/PluginRespirator.java
Log:
Fix links within freesites.
URL-encode some parts of the URI that were just appended.
Pass static CSS through the content filter to fix the links.
Make the content filter support this (support relative links when the passed-in 
base URI is inside the static toadlet).


Modified: trunk/freenet/src/freenet/clients/http/FProxyToadlet.java
===================================================================
--- trunk/freenet/src/freenet/clients/http/FProxyToadlet.java   2009-01-06 
21:22:31 UTC (rev 24939)
+++ trunk/freenet/src/freenet/clients/http/FProxyToadlet.java   2009-01-06 
21:34:01 UTC (rev 24940)
@@ -133,7 +133,7 @@
                Bucket toFree = null;
                try {
                        if((!force) && (!forceDownload)) {
-                               FilterOutput fo = ContentFilter.filter(data, 
bucketFactory, mimeType, key.toURI(basePath), container.enableInlinePrefetch() 
? prefetchHook : null);
+                               FilterOutput fo = ContentFilter.filter(data, 
bucketFactory, mimeType, key.toURI(basePath), container.enableInlinePrefetch() 
? prefetchHook : null, ctx);
                                if(data != fo.data) toFree = fo.data;
                                data = fo.data;
                                mimeType = fo.type;

Modified: trunk/freenet/src/freenet/clients/http/StaticToadlet.java
===================================================================
--- trunk/freenet/src/freenet/clients/http/StaticToadlet.java   2009-01-06 
21:22:31 UTC (rev 24939)
+++ trunk/freenet/src/freenet/clients/http/StaticToadlet.java   2009-01-06 
21:34:01 UTC (rev 24940)
@@ -9,6 +9,8 @@
 import java.util.Date;
 
 import freenet.client.DefaultMIMETypes;
+import freenet.clients.http.filter.ContentFilter;
+import freenet.clients.http.filter.ContentFilter.FilterOutput;
 import freenet.l10n.L10n;
 import freenet.support.api.Bucket;
 import freenet.support.api.HTTPRequest;
@@ -62,10 +64,18 @@
                strm.close();
                os.close();
                
+               String mimeType = DefaultMIMETypes.guessMIMEType(path, false);
+               
+               if(mimeType.equals("text/css")) {
+                       // Easiest way to fix the links is just to pass it 
through the content filter.
+                       FilterOutput fo = ContentFilter.filter(data, 
ctx.getBucketFactory(), mimeType, uri, null, ctx);
+                       data = fo.data;
+               }
+               
                URL url = getClass().getResource(ROOT_PATH+path);
                Date mTime = getUrlMTime(url);
                
-               ctx.sendReplyHeaders(200, "OK", null, 
DefaultMIMETypes.guessMIMEType(path, false), data.size(), mTime);
+               ctx.sendReplyHeaders(200, "OK", null, mimeType, data.size(), 
mTime);
 
                ctx.writeData(data);
                data.free();

Modified: trunk/freenet/src/freenet/clients/http/filter/ContentFilter.java
===================================================================
--- trunk/freenet/src/freenet/clients/http/filter/ContentFilter.java    
2009-01-06 21:22:31 UTC (rev 24939)
+++ trunk/freenet/src/freenet/clients/http/filter/ContentFilter.java    
2009-01-06 21:34:01 UTC (rev 24940)
@@ -12,6 +12,7 @@
 import java.util.HashMap;
 import java.util.Hashtable;
 
+import freenet.clients.http.LinkFixer;
 import freenet.l10n.L10n;
 import freenet.support.Logger;
 import freenet.support.api.Bucket;
@@ -136,7 +137,7 @@
         * @throws IllegalStateException
         *             If data is invalid (e.g. corrupted file) and the filter 
have no way to recover.
         */
-       public static FilterOutput filter(Bucket data, BucketFactory bf, String 
typeName, URI baseURI, FoundURICallback cb) throws UnsafeContentTypeException, 
IOException {
+       public static FilterOutput filter(Bucket data, BucketFactory bf, String 
typeName, URI baseURI, FoundURICallback cb, LinkFixer fixer) throws 
UnsafeContentTypeException, IOException {
                if(Logger.shouldLog(Logger.MINOR, ContentFilter.class))
                        Logger.minor(ContentFilter.class, 
"filter(data.size="+data.size()+" typeName="+typeName);
                String type = typeName;
@@ -184,7 +185,7 @@
                                        charset = detectCharset(data, handler);
                                }
                                
-                               Bucket outputData = 
handler.readFilter.readFilter(data, bf, charset, otherParams, new 
GenericReadFilterCallback(baseURI, cb));
+                               Bucket outputData = 
handler.readFilter.readFilter(data, bf, charset, otherParams, new 
GenericReadFilterCallback(baseURI, cb, fixer));
                                if(charset != null)
                                        type = type + "; charset="+charset;
                                return new FilterOutput(outputData, type);

Modified: 
trunk/freenet/src/freenet/clients/http/filter/GenericReadFilterCallback.java
===================================================================
--- 
trunk/freenet/src/freenet/clients/http/filter/GenericReadFilterCallback.java    
    2009-01-06 21:22:31 UTC (rev 24939)
+++ 
trunk/freenet/src/freenet/clients/http/filter/GenericReadFilterCallback.java    
    2009-01-06 21:34:01 UTC (rev 24940)
@@ -11,6 +11,7 @@
 import java.util.HashSet;
 
 import freenet.clients.http.HTTPRequestImpl;
+import freenet.clients.http.LinkFixer;
 import freenet.clients.http.StaticToadlet;
 import freenet.keys.FreenetURI;
 import freenet.l10n.L10n;
@@ -40,18 +41,21 @@
        private URI baseURI;
        private URI strippedBaseURI;
        private final FoundURICallback cb;
+       private final LinkFixer fixer;
        
-       public GenericReadFilterCallback(URI uri, FoundURICallback cb) {
+       public GenericReadFilterCallback(URI uri, FoundURICallback cb, 
LinkFixer fixer) {
+               this.fixer = fixer;
                this.baseURI = uri;
                this.cb = cb;
                setStrippedURI(uri.toString());
        }
        
-       public GenericReadFilterCallback(FreenetURI uri, FoundURICallback cb) {
+       public GenericReadFilterCallback(FreenetURI uri, FoundURICallback cb, 
LinkFixer fixer) {
                try {
                        this.baseURI = uri.toRelativeURI();
                        setStrippedURI(baseURI.toString());
                        this.cb = cb;
+                       this.fixer = fixer;
                } catch (URISyntaxException e) {
                        throw new Error(e);
                }
@@ -131,10 +135,10 @@
                                        bookmark_activelink = 
HTMLEncoder.encode(bookmark_activelink);
                                        url = url+"&hasAnActivelink=true";
                                }
-                               return url;
+                               return fixer.fixLink(url);
                        } else if(path.startsWith(StaticToadlet.ROOT_URL)) {
                                // @see bug #2297
-                               return path;
+                               return fixer.fixLink(path);
                        }
                }
                
@@ -175,6 +179,11 @@
                        // Relative URI
                        
                        rpath = resolved.getPath();
+                       
+                       if(rpath.startsWith(StaticToadlet.ROOT_URL)) {
+                               return fixer.fixLink(rpath);
+                       }
+                       
                        if(rpath == null) throw new CommentException("No URI");
                        if(logMINOR) Logger.minor(this, "Resolved URI (rpath 
relative): "+rpath);
                        
@@ -197,7 +206,7 @@
                }
                
                
if(GenericReadFilterCallback.allowedProtocols.contains(uri.getScheme()))
-                       return 
"/?"+GenericReadFilterCallback.magicHTTPEscapeString+ '=' +uri;
+                       return 
fixer.fixLink("/?"+GenericReadFilterCallback.magicHTTPEscapeString+ '=' 
+freenet.support.URLEncoder.encode(uri.toString(), false));
                else {
                        if(uri.getScheme() == null) {
                                throw new CommentException(reason);
@@ -237,15 +246,17 @@
                        sb.append(path);
                        if(typeOverride != null) {
                                sb.append("?type=");
-                               sb.append(typeOverride);
+                               
sb.append(freenet.support.URLEncoder.encode(typeOverride, false));
                        }
                        if(u.getFragment() != null) {
                                sb.append('#');
-                               sb.append(u.getRawFragment());
+                               
sb.append(freenet.support.URLEncoder.encode(u.getRawFragment(), false));
                        }
                        
                        URI uri = new URI(sb.toString());
                        
+                       uri = fixer.fixLink(uri);
+                       
                        if(!noRelative)
                                uri = strippedBaseURI.relativize(uri);
                        if(Logger.shouldLog(Logger.MINOR, this))
@@ -255,7 +266,7 @@
                        Logger.error(this, "Could not parse own URI: 
path="+path+", typeOverride="+typeOverride+", frag="+u.getFragment()+" : "+e, 
e);
                        String p = path;
                        if(typeOverride != null)
-                               p += "?type="+typeOverride;
+                               p += 
"?type="+freenet.support.URLEncoder.encode(typeOverride, false);
                        if(u.getFragment() != null){
                                try{
                                // FIXME encode it properly
@@ -345,7 +356,7 @@
        }
 
        public static String escapeURL(String uri) {
-               return "/?" + magicHTTPEscapeString + '=' + uri;
+               return "/?" + magicHTTPEscapeString + '=' + 
freenet.support.URLEncoder.encode(uri, false);
        }
        
 }

Modified: trunk/freenet/src/freenet/clients/http/filter/PNGFilter.java
===================================================================
--- trunk/freenet/src/freenet/clients/http/filter/PNGFilter.java        
2009-01-06 21:22:31 UTC (rev 24939)
+++ trunk/freenet/src/freenet/clients/http/filter/PNGFilter.java        
2009-01-06 21:34:01 UTC (rev 24940)
@@ -304,7 +304,7 @@
                final Bucket out = new FileBucket(fout, false, true, false, 
false, false);
                try {
                        Logger.setupStdoutLogging(Logger.MINOR, "");
-                       ContentFilter.FilterOutput output = 
ContentFilter.filter(data, new ArrayBucketFactory(), "image/png", new 
URI("http://127.0.0.1:8888/";), null);
+                       ContentFilter.FilterOutput output = 
ContentFilter.filter(data, new ArrayBucketFactory(), "image/png", new 
URI("http://127.0.0.1:8888/";), null, null);
                        BucketTools.copy(output.data, out);
                } catch(IOException e) {
                        System.out.println("Bucket error?: " + e.getMessage());

Modified: trunk/freenet/src/freenet/node/NodeClientCore.java
===================================================================
--- trunk/freenet/src/freenet/node/NodeClientCore.java  2009-01-06 21:22:31 UTC 
(rev 24939)
+++ trunk/freenet/src/freenet/node/NodeClientCore.java  2009-01-06 21:34:01 UTC 
(rev 24940)
@@ -15,6 +15,7 @@
 import freenet.client.async.USKManager;
 import freenet.client.events.SimpleEventProducer;
 import freenet.clients.http.FProxyToadlet;
+import freenet.clients.http.LinkFixer;
 import freenet.clients.http.SimpleToadletServer;
 import freenet.clients.http.filter.FilterCallback;
 import freenet.clients.http.filter.FoundURICallback;
@@ -1143,10 +1144,10 @@
                return node.getMyName();
        }
 
-       public FilterCallback createFilterCallback(URI uri, FoundURICallback 
cb) {
+       public FilterCallback createFilterCallback(URI uri, FoundURICallback 
cb, LinkFixer fixer) {
                if(logMINOR)
-                       Logger.minor(this, "Creating filter callback: " + uri + 
", " + cb);
-               return new GenericReadFilterCallback(uri, cb);
+                       Logger.minor(this, "Creating filter callback: " + uri + 
", " + cb+" , "+fixer);
+               return new GenericReadFilterCallback(uri, cb, fixer);
        }
 
        public int maxBackgroundUSKFetchers() {

Modified: trunk/freenet/src/freenet/node/TextModeClientInterface.java
===================================================================
--- trunk/freenet/src/freenet/node/TextModeClientInterface.java 2009-01-06 
21:22:31 UTC (rev 24939)
+++ trunk/freenet/src/freenet/node/TextModeClientInterface.java 2009-01-06 
21:34:01 UTC (rev 24940)
@@ -31,6 +31,8 @@
 import freenet.client.InsertBlock;
 import freenet.client.InsertException;
 import freenet.client.events.EventDumper;
+import freenet.clients.http.LinkFixer;
+import freenet.clients.http.NullLinkFixer;
 import freenet.clients.http.filter.ContentFilter;
 import freenet.clients.http.filter.ContentFilter.FilterOutput;
 import freenet.crypt.RandomSource;
@@ -351,7 +353,9 @@
        final String content = readLines(reader, false);
        final Bucket data = new ArrayBucket(content.getBytes("UTF-8"));
        try {
-               FilterOutput output = ContentFilter.filter(data, new 
ArrayBucketFactory(), "text/html", new URI("http://127.0.0.1:8888/";), null);
+               LinkFixer fixer = n.clientCore.toadletContainer;
+               if(fixer == null) fixer = new NullLinkFixer();
+               FilterOutput output = ContentFilter.filter(data, new 
ArrayBucketFactory(), "text/html", new URI("http://127.0.0.1:8888/";), null, new 
NullLinkFixer());
                
                BufferedInputStream bis = new 
BufferedInputStream(output.data.getInputStream());
                while(bis.available() > 0){

Modified: trunk/freenet/src/freenet/pluginmanager/PluginRespirator.java
===================================================================
--- trunk/freenet/src/freenet/pluginmanager/PluginRespirator.java       
2009-01-06 21:22:31 UTC (rev 24939)
+++ trunk/freenet/src/freenet/pluginmanager/PluginRespirator.java       
2009-01-06 21:34:01 UTC (rev 24940)
@@ -3,6 +3,7 @@
 import java.net.URISyntaxException;
 
 import freenet.client.HighLevelSimpleClient;
+import freenet.clients.http.NullLinkFixer;
 import freenet.clients.http.PageMaker;
 import freenet.clients.http.filter.FilterCallback;
 import freenet.node.Node;
@@ -39,7 +40,7 @@
 
        public FilterCallback makeFilterCallback(String path) {
                try {
-                       return 
node.clientCore.createFilterCallback(URIPreEncoder.encodeURI(path), null);
+                       return 
node.clientCore.createFilterCallback(URIPreEncoder.encodeURI(path), null, new 
NullLinkFixer());
                } catch (URISyntaxException e) {
                        throw new Error(e);
                }

_______________________________________________
cvs mailing list
[email protected]
http://emu.freenetproject.org/cgi-bin/mailman/listinfo/cvs

Reply via email to