Author: toad
Date: 2006-12-01 02:06:10 +0000 (Fri, 01 Dec 2006)
New Revision: 11166

Modified:
   trunk/freenet/src/freenet/clients/http/FProxyToadlet.java
   trunk/freenet/src/freenet/clients/http/QueueToadlet.java
Log:
Add a "go back to the referer" link.

Modified: trunk/freenet/src/freenet/clients/http/FProxyToadlet.java
===================================================================
--- trunk/freenet/src/freenet/clients/http/FProxyToadlet.java   2006-12-01 
01:36:18 UTC (rev 11165)
+++ trunk/freenet/src/freenet/clients/http/FProxyToadlet.java   2006-12-01 
02:06:10 UTC (rev 11166)
@@ -83,7 +83,7 @@

        }

-       public static void handleDownload(ToadletContext context, Bucket data, 
BucketFactory bucketFactory, String mimeType, String requestedMimeType, String 
forceString, boolean forceDownload, String basePath, FreenetURI key, String 
extras) throws ToadletContextClosedException, IOException {
+       public static void handleDownload(ToadletContext context, Bucket data, 
BucketFactory bucketFactory, String mimeType, String requestedMimeType, String 
forceString, boolean forceDownload, String basePath, FreenetURI key, String 
extras, String referrer) throws ToadletContextClosedException, IOException {
                if(requestedMimeType != null)
                        mimeType = requestedMimeType;

@@ -130,6 +130,11 @@
                                        option = optionList.addChild("li");
                                        option.addChild("a", "href", basePath + 
key.toString(false) + "?type=application/xml+rss&force=" + getForceValue(key, 
now)+extras, "Click here");
                                        option.addChild("%", " to open the file 
as RSS (<b>this is dangerous if the site author is malicious</b>).");
+                                       if(referrer != null) {
+                                               option = 
optionList.addChild("li");
+                                               option.addChild("a", "href", 
referrer, "Click here");
+                                               option.addChild("#", " to go 
back to the referring page.");
+                                       }
                                        option = optionList.addChild("li");
                                        option.addChild("a", "href", "/", 
"Click here");
                                        option.addChild("#", " to go to the 
FProxy home page.");
@@ -175,6 +180,11 @@
                        option = optionList.addChild("li");
                        option.addChild("a", "href", basePath + 
key.toString(false) + "?force=" + getForceValue(key, now)+extras, "Click here");
                        option.addChild("#", " to open the file as " + mimeType 
+ '.');
+                       if(referrer != null) {
+                               option = optionList.addChild("li");
+                               option.addChild("a", "href", referrer, "Click 
here");
+                               option.addChild("#", " to go back to the 
referring page.");
+                       }
                        option = optionList.addChild("li");
                        option.addChild("a", "href", "/", "Click here");
                        option.addChild("#", " to go to the FProxy home page.");
@@ -326,8 +336,10 @@
                        Bucket data = result.asBucket();
                        String mimeType = result.getMimeType();

-                       handleDownload(ctx, data, ctx.getBucketFactory(), 
mimeType, requestedMimeType, httprequest.getParam("force", null), 
httprequest.isParameterSet("forcedownload"), "/", key, maxSize != MAX_LENGTH ? 
"&max-size="+maxSize : "");
+                       String referer = sanitizeReferer(ctx);

+                       handleDownload(ctx, data, ctx.getBucketFactory(), 
mimeType, requestedMimeType, httprequest.getParam("force", null), 
httprequest.isParameterSet("forcedownload"), "/", key, maxSize != MAX_LENGTH ? 
"&max-size="+maxSize : "", referer);
+                       
                } catch (FetchException e) {
                        String msg = e.getMessage();
                        String extra = "";
@@ -424,6 +436,28 @@
                }
        }

+       private String sanitizeReferer(ToadletContext ctx) {
+               // FIXME we do something similar in the GenericFilterCallback 
thingy?
+               String referer = (String) ctx.getHeaders().get("referer");
+               if(referer != null) {
+                       try {
+                               URI refererURI = new URI(referer);
+                               String path = refererURI.getPath();
+                               while(path.startsWith("/")) path = 
path.substring(1);
+                               FreenetURI furi = new FreenetURI(path);
+                               HTTPRequest req = new HTTPRequest(refererURI);
+                               String type = req.getParam("type");
+                               referer = "/" + furi.toString(false);
+                               if(type != null && type.length() > 0)
+                                       referer += "?type=" + type;
+                       } catch (Throwable t) {
+                               Logger.error(this, "Caught handling referrer: 
"+t+" for "+referer, t);
+                               referer = null;
+                       }
+               }
+               return referer;
+       }
+
        private static String getForceValue(FreenetURI key, long time) {
                MessageDigest md = SHA256.getMessageDigest();
                ByteArrayOutputStream bos = new ByteArrayOutputStream();

Modified: trunk/freenet/src/freenet/clients/http/QueueToadlet.java
===================================================================
--- trunk/freenet/src/freenet/clients/http/QueueToadlet.java    2006-12-01 
01:36:18 UTC (rev 11165)
+++ trunk/freenet/src/freenet/clients/http/QueueToadlet.java    2006-12-01 
02:06:10 UTC (rev 11166)
@@ -310,7 +310,7 @@
                                                        String mimeType = 
clientGet.getMIMEType();
                                                        String 
requestedMimeType = request.getParam("type", null);
                                                        String forceString = 
request.getParam("force");
-                                                       
FProxyToadlet.handleDownload(ctx, data, ctx.getBucketFactory(), mimeType, 
requestedMimeType, forceString, request.isParameterSet("forcedownload"), 
"/queue/", key, "");
+                                                       
FProxyToadlet.handleDownload(ctx, data, ctx.getBucketFactory(), mimeType, 
requestedMimeType, forceString, request.isParameterSet("forcedownload"), 
"/queue/", key, "", "/queue/");
                                                        return;
                                                }
                                        }


Reply via email to