diff -ur freenet-6190/src/freenet/client/http/filter/SaferFilter.java freenet/src/freenet/client/http/filter/SaferFilter.java --- freenet-6190/src/freenet/client/http/filter/SaferFilter.java 2003-07-29 05:33:15.000000000 +0200 +++ freenet/src/freenet/client/http/filter/SaferFilter.java 2003-09-10 22:39:06.000000000 +0200 @@ -692,10 +692,7 @@ allowedTagsVerifiers.put("base", new TagVerifier("base", new String[] {"id", "target"}, new String[] {"href"})); - allowedTagsVerifiers.put("img", new CoreTagVerifier("img", - new String[] {"alt", "name", "height", "width", "ismap", "align", "border", "hspace", "vspace"}, - new String[] {"src", "longdesc", "usemap"}, - emptyStringArray)); + allowedTagsVerifiers.put("img", new ImageTagVerifier()); // FIXME: object tag - http://www.w3.org/TR/html4/struct/objects.html#h-13.3 // FIXME: param tag - http://www.w3.org/TR/html4/struct/objects.html#h-13.3.2 // applet tag PROHIBITED - we do not support applets (FIXME?) @@ -1105,6 +1102,26 @@ } } + static class ImageTagVerifier extends CoreTagVerifier { + ImageTagVerifier() { + super("img", + new String[] {"alt", "name", "height", "width", "ismap", "align", "border", "hspace", "vspace"}, + new String[] {"src", "longdesc", "usemap"}, + emptyStringArray); + } + + Hashtable sanitizeHash(Hashtable h, ParsedTag p, HTMLParseContext pc) { + Hashtable hn = super.sanitizeHash(h, p, pc); + + String src = getHashString(hn, "src"); + if (src != null) { + hn.put("src", src + "?tagtype=img"); + } + + return hn; + } + } + static class LinkTagVerifier extends CoreTagVerifier { LinkTagVerifier(String tag, String[] allowedAttrs, String[] uriAttrs, String[] eventAttrs) { super(tag, allowedAttrs, uriAttrs, eventAttrs); diff -ur freenet-6190/src/freenet/client/http/FproxyServlet.java freenet/src/freenet/client/http/FproxyServlet.java --- freenet-6190/src/freenet/client/http/FproxyServlet.java 2003-09-03 22:00:43.000000000 +0200 +++ freenet/src/freenet/client/http/FproxyServlet.java 2003-09-11 21:23:47.000000000 +0200 @@ -374,6 +374,7 @@ String queryHtl = null; String queryMime = null; String queryDate = null; + String queryTagtype = null; String queryMaxLogSize = null; boolean queryRDate = false; boolean queryVerbose = false; @@ -477,6 +478,14 @@ queryDateMillis = -1; } } + + queryTagtype = req.getParameter("tagtype"); + if (queryTagtype != null) { + queryTagtype = freenet.support.URLDecoder.decode(queryTagtype); + if(logDEBUG) logger.log(this, "Read tagtype from query: " + queryTagtype, + Logger.DEBUGGING); + } + } catch (Exception e) { logger.log(this, "Error while parsing URI", e, Logger.ERROR); @@ -498,7 +507,7 @@ String encKey = URLEncoder.encode(queryKey); queryKey = reconstructRequest(HTMLEncoder.encode(encKey), queryForce, queryHtl, queryMime, - queryDate, ""); + queryDate, "", null); // ignore the try # try { resp.sendRedirect("/" + queryKey); @@ -575,18 +584,82 @@ FailureListener listener = new FailureListener(logger); r.addEventListener(listener); - if (!r.doGet(uri, data, htlUsed)) { - if (!(queryRDate && listener.dr != null)) { - if(logDEBUG) logger.log(this, "Request process returned error for "+ - uri+" with htl "+htlUsed, Logger.DEBUG); - writeErrorMessage(listener.getException(r,uri,req), req,resp, - null, key, uri, htlUsed, queryDate, - queryMime, queryForce, tryNum+1); + if ((queryTagtype != null) && (queryTagtype.equals("img"))) { + long timebefore = System.currentTimeMillis(); + if (!r.doGet(uri, data, 0)) { + if (tryNum == 5) { + if(logDEBUG) logger.log(this, "Request process returned error for "+ + uri+" with htl "+htlUsed, Logger.DEBUG); + writeErrorMessage(listener.getException(r,uri,req), req,resp, + null, key, uri, htlUsed, queryDate, + queryMime, queryForce, tryNum+1); + return; + } + + long timeafter = System.currentTimeMillis(); + logger.log(this, "Failed doGet with HTL 0 took: " + (timeafter-timebefore) + "ms", Logger.NORMAL); + r.doGet(uri, data, htlUsed, true); + try { + String image = "aqua/download.gif"; + resp.setContentType("image/gif"); + + InputStream imagenbIS = this.getClass().getResourceAsStream(HtmlTemplate.TEMPLATEDIR + + "images/" + image); + if (imagenbIS == null) { + logger.log(this, "Can't find image " + image, logger.ERROR); + resp.sendError(404); + return; + } + resp.addDateHeader("Expires", System.currentTimeMillis()+ + 60*1000); + + String encKey = ""; + + if (key != null) { + encKey = URLEncoder.encode(key); + logger.log(this, "key is " + key, logger.NORMAL); + } else { + logger.log(this, "key is null.", logger.NORMAL); + } + + String newURL = constructURI(encKey, + queryMime, queryDate, + queryForce, htlUsed, + tryNum+1, queryTagtype); + + logger.log(this, "newURL set to /" + newURL, logger.NORMAL); + + resp.addHeader("Refresh", "45; URL=/" + newURL); + + BufferedInputStream imageIS = new BufferedInputStream(imagenbIS); + OutputStream imageOS = resp.getOutputStream(); + int r1 = imageIS.read(); + while (r1 != -1) { + imageOS.write(r1); + r1 = imageIS.read(); + } + } catch (Exception e) { + logger.log(this, "Failed to read/write image", e, logger.ERROR); + } + try { + resp.flushBuffer(); + } catch (IOException e) {} return; } } else { - if(logDEBUG) logger.log(this, "Request process returned success for "+ - uri+" with htl "+htlUsed, Logger.DEBUGGING); + if (!r.doGet(uri, data, htlUsed)) { + if (!(queryRDate && listener.dr != null)) { + if(logDEBUG) logger.log(this, "Request process returned error for "+ + uri+" with htl "+htlUsed, Logger.DEBUG); + writeErrorMessage(listener.getException(r,uri,req), req,resp, + null, key, uri, htlUsed, queryDate, + queryMime, queryForce, tryNum+1); + return; + } + } else { + if(logDEBUG) logger.log(this, "Request process returned success for "+ + uri+" with htl "+htlUsed, Logger.DEBUGGING); + } } if (queryRDate && listener.dr != null) { @@ -594,7 +667,8 @@ FreenetURI newURI = listener.dr.getTargetForTime(uri, time); String redirect = reconstructRequest(newURI.toString(false), queryForce, queryHtl, - queryMime, null, null); + queryMime, null, null, + null); resp.sendRedirect("/" + redirect); return; } @@ -705,7 +779,7 @@ String encKey = URLEncoder.encode(key); String redirect = "/servlet/SFRequest/" + reconstructRequest(encKey, "", queryHtl, queryMime, - queryDate, ""); + queryDate, "", null); if(forced) { char c = (redirect.indexOf('?')!=-1) ? '&' : '?'; redirect += c + "runFilter=false"; @@ -872,7 +946,8 @@ */ private String reconstructRequest(String queryKey, String queryForce, String queryHtl, String queryMime, - String queryDate, String queryTry) { + String queryDate, String queryTry, + String queryTagtype) { int count = 0; if (queryForce != null) { queryKey += getPrefix(count++) + "force=" + queryForce; @@ -889,6 +964,10 @@ if (queryTry != null) { queryKey += getPrefix(count++) + "try=" + queryTry; } + if (queryTagtype != null) { + queryKey += getPrefix(count++) + "tagtype=" + queryTagtype; + } + return queryKey; } @@ -1014,7 +1093,7 @@ encKey + extraDate + "&mime=text/plain"+extraDate+"\">source"; w += ", force save to disk"; w += ", or return to gateway page.
"; pw.println(w); @@ -1117,8 +1196,8 @@ } pageTmp = refreshPageTmp; pageTmp.set("REFRESH-TIME", Long.toString(10 << tryNum)); - pageTmp.set("REFRESH-URL", "/" + constructURI(encKey, encMime, encDate, encForce, htlNew, tryNum)); - if(logDEBUG) logger.log(this, "REFRESH-URL:/" + constructURI(encKey, encMime, encDate, encForce, htlNew, tryNum), Logger.DEBUG); + pageTmp.set("REFRESH-URL", "/" + constructURI(encKey, encMime, encDate, encForce, htlNew, tryNum, null)); + if(logDEBUG) logger.log(this, "REFRESH-URL:/" + constructURI(encKey, encMime, encDate, encForce, htlNew, tryNum, null), Logger.DEBUG); titleBoxTmp.set("TITLE", "Network Error"); if(SimpleAdvanced_ModeUtils.isAdvancedMode(req)) { pw.println("Couldn't retrieve key: " + encKey + ""); @@ -1217,9 +1296,10 @@ * @param tryNum Number of Retry */ private String constructURI(String encKey, String encMime, String encDate, - String encForce, int htl, int tryNum) { + String encForce, int htl, int tryNum, String encTagtype) { return reconstructRequest(encKey, encForce, Integer.toString(htl), - encMime, encDate, Integer.toString(tryNum)); + encMime, encDate, Integer.toString(tryNum), + encTagtype); }