package freenet.clients.http; import freenet.client.HighLevelSimpleClient; import freenet.clients.http.PageMaker.RenderParameters; import freenet.l10n.NodeL10n; import freenet.node.Node; import freenet.support.HTMLNode; import freenet.support.MultiValueTable; import freenet.support.api.HTTPRequest; import java.io.IOException; import java.net.URI; /** * The External Link Toadlet */ public class ExternalLinkToadlet extends Toadlet { private static final int MAX_URL_LENGTH = 1024 * 1024; public static final String PATH = "/external-link/"; private static final String magicHTTPEscapeString = "_CHECKED_HTTP_"; private final Node node; ExternalLinkToadlet(HighLevelSimpleClient client, Node node) { super(client); this.node = node; } @Override public String path() { return PATH; } public void handleMethodPOST(URI uri, HTTPRequest request, ToadletContext ctx) throws ToadletContextClosedException, IOException { String url = request.getPartAsStringFailsafe(magicHTTPEscapeString, MAX_URL_LENGTH); MultiValueTable<String, String> headers = new MultiValueTable<String, String>(); //If the user clicked cancel, or the URL is not defined, return to the main page. //TODO: This will mean the beginning of the first time wizard if it's still in progress. //TODO: Is it worth it to fix that? if (request.getPartAsStringFailsafe("Go", 32).isEmpty() || url.isEmpty()) { url = WelcomeToadlet.PATH; } headers.put("Location", url); ctx.sendReplyHeaders(302, "Found", headers, null, 0); } public void handleMethodGET(URI uri, HTTPRequest request, ToadletContext ctx) throws ToadletContextClosedException, IOException { //Unexpected: a URL should have been specified. if (request.getParam(magicHTTPEscapeString).isEmpty()) { MultiValueTable<String, String> headers = new MultiValueTable<String, String>(); headers.put("Location", WelcomeToadlet.PATH); ctx.sendReplyHeaders(302, "Found", headers, null, 0); return; } //Confirm whether the user really means to access an HTTP link. //Only render status and navigation bars if the user has completed the wizard. boolean renderBars = node.clientCore.getToadletContainer().fproxyHasCompletedWizard(); PageNode page = ctx.getPageMaker().getPageNode(l10n("confirmExternalLinkTitle"), ctx, new RenderParameters().renderNavigationLinks(renderBars).renderStatus(renderBars)); HTMLNode pageNode = page.outer; HTMLNode contentNode = page.content; HTMLNode warnboxContent = ctx.getPageMaker().getInfobox("infobox-warning", l10n("confirmExternalLinkSubTitle"), contentNode, "confirm-external-link", true); HTMLNode externalLinkForm = ctx.addFormChild(warnboxContent, PATH, "confirmExternalLinkForm"); final String target = request.getParam(magicHTTPEscapeString); externalLinkForm.addChild("#", l10n("confirmExternalLinkWithURL", "url", target)); externalLinkForm.addChild("br"); externalLinkForm.addChild("input", new String[]{"type", "name", "value"}, new String[]{"hidden", magicHTTPEscapeString, target}); externalLinkForm.addChild("input", new String[]{"type", "name", "value"}, new String[]{"submit", "cancel", NodeL10n.getBase().getString("Toadlet.cancel")}); externalLinkForm.addChild("input", new String[]{"type", "name", "value"}, new String[]{"submit", "Go", l10n("goToExternalLink")}); this.writeHTMLReply(ctx, 200, "OK", null, pageNode.generate(), true); } /** * Prepends a given URI with the path and parameter names to get this external link confirmation page. * @param uri URI to prompt for confirmation. * @return String appropriate for a link. */ public static String escape(String uri) { return ExternalLinkToadlet.PATH+"?" + magicHTTPEscapeString + '=' + uri; } private static String l10n(String key, String pattern, String value) { return NodeL10n.getBase().getString("WelcomeToadlet." + key, new String[]{pattern}, new String[]{value}); } private static String l10n(String key) { return NodeL10n.getBase().getString("WelcomeToadlet." + key); } }