package freenet.clients.http; import java.io.IOException; import java.net.URI; import freenet.client.HighLevelSimpleClient; import freenet.client.InsertContext; import freenet.client.InsertContext.CompatibilityMode; import freenet.client.filter.FilterOperation; import freenet.clients.http.ContentFilterToadlet.ResultHandling; import freenet.l10n.NodeL10n; import freenet.node.NodeClientCore; import freenet.node.SecurityLevels.NETWORK_THREAT_LEVEL; import freenet.support.HTMLNode; import freenet.support.api.HTTPRequest; public class FileInsertWizardToadlet extends Toadlet implements LinkEnabledCallback { protected FileInsertWizardToadlet (HighLevelSimpleClient client, NodeClientCore clientCore) { super(client); this.core = clientCore; } final NodeClientCore core; // IMHO there isn't much point synchronizing these. private boolean rememberedLastTime; private boolean wasCanonicalLastTime; static final String PATH = "/insertfile/"; @Override public String path() { return PATH; } public void reportCanonicalInsert() { rememberedLastTime = true; wasCanonicalLastTime = true; } public void reportRandomInsert() { rememberedLastTime = true; wasCanonicalLastTime = false; } public void handleMethodGET (URI uri, final HTTPRequest request, final ToadletContext ctx) throws ToadletContextClosedException, IOException, RedirectException { // // We ensure that we have a FCP server running // if(!fcp.enabled){ // writeError(NodeL10n.getBase().getString("QueueToadlet.fcpIsMissing"), NodeL10n.getBase().getString("QueueToadlet.pleaseEnableFCP"), ctx, false); // return; // } // if(!core.hasLoadedQueue()) { // writeError(NodeL10n.getBase().getString("QueueToadlet.notLoadedYetTitle"), NodeL10n.getBase().getString("QueueToadlet.notLoadedYet"), ctx, false); // return; // } if (container.publicGatewayMode() && !ctx.isAllowedFullAccess()) { sendUnauthorizedPage(ctx); return; } final PageMaker pageMaker = ctx.getPageMaker(); PageNode page = pageMaker.getPageNode(l10n("pageTitle"), ctx); HTMLNode pageNode = page.outer; HTMLNode contentNode = page.content; /* add alert summary box */ if (ctx.isAllowedFullAccess()) contentNode.addChild(ctx.getAlertManager().createSummary()); contentNode.addChild(createInsertBox(pageMaker, ctx, ctx.isAdvancedModeEnabled())); if(ctx.isAdvancedModeEnabled()) contentNode.addChild(createFilterBox(pageMaker, ctx)); writeHTMLReply(ctx, 200, "OK", null, pageNode.generate()); } private HTMLNode createInsertBox (PageMaker pageMaker, ToadletContext ctx, boolean isAdvancedModeEnabled) { /* the insert file box */ InfoboxNode infobox = pageMaker.getInfobox( NodeL10n.getBase().getString("QueueToadlet.insertFile"), "insert-queue", true); HTMLNode insertBox = infobox.outer; HTMLNode insertContent = infobox.content; insertContent.addChild("p", l10n("insertIntro")); NETWORK_THREAT_LEVEL seclevel = core.node.securityLevels.getNetworkThreatLevel(); HTMLNode insertForm = ctx.addFormChild(insertContent, QueueToadlet.PATH_UPLOADS, "queueInsertForm"); HTMLNode input = insertForm.addChild("input", new String[] { "type", "name", "value" }, new String[] { "radio", "keytype", "CHK" }); if ((!rememberedLastTime && seclevel == NETWORK_THREAT_LEVEL.LOW) || (rememberedLastTime && wasCanonicalLastTime && seclevel != NETWORK_THREAT_LEVEL.MAXIMUM)) { input.addAttribute("checked", "checked"); } insertForm.addChild("b", l10n("insertCanonicalTitle")); insertForm.addChild("#", ": "+l10n("insertCanonical")); if(isAdvancedModeEnabled) insertForm.addChild("#", " "+l10n("insertCanonicalAdvanced")); insertForm.addChild("br"); input = insertForm.addChild("input", new String[] { "type", "name", "value" }, new String[] { "radio", "keytype", "SSK" }); if (seclevel == NETWORK_THREAT_LEVEL.MAXIMUM || (rememberedLastTime && !wasCanonicalLastTime)) { input.addAttribute("checked", "checked"); } insertForm.addChild("b", l10n("insertRandomTitle")); insertForm.addChild("#", ": "+l10n("insertRandom")); if(isAdvancedModeEnabled) insertForm.addChild("#", " "+l10n("insertRandomAdvanced")); if (isAdvancedModeEnabled) { insertForm.addChild("br"); insertForm.addChild("input", new String[] { "type", "name", "value" }, new String[] { "radio", "keytype", "specify" }); insertForm.addChild("b", l10n("insertSpecificKeyTitle")); insertForm.addChild("#", ": "+l10n("insertSpecificKey")+" "); insertForm.addChild("input", new String[] { "type", "name", "value" }, new String[] { "text", "key", "KSK@" }); } if (isAdvancedModeEnabled) { insertForm.addChild("br"); insertForm.addChild("br"); insertForm.addChild("input", new String[] { "type", "name", "checked" }, new String[] { "checkbox", "compress", "checked" }); insertForm.addChild("#", ' ' + NodeL10n.getBase().getString("QueueToadlet.insertFileCompressLabel")); } else { insertForm.addChild("input", new String[] { "type", "name", "value" }, new String[] { "hidden", "compress", "true" }); } if(isAdvancedModeEnabled) { insertForm.addChild("br"); insertForm.addChild("#", NodeL10n.getBase().getString("QueueToadlet.compatModeLabel")+": "); HTMLNode select = insertForm.addChild("select", "name", "compatibilityMode"); for(CompatibilityMode mode : InsertContext.CompatibilityMode.values()) { if(mode == CompatibilityMode.COMPAT_UNKNOWN) continue; // FIXME l10n??? HTMLNode option = select.addChild("option", "value", mode.name(), NodeL10n.getBase().getString("InsertContext.CompatibilityMode."+mode.name())); if (mode == CompatibilityMode.COMPAT_DEFAULT) option.addAttribute("selected", ""); } insertForm.addChild("br"); insertForm.addChild("#", l10n("splitfileCryptoKeyLabel")+": "); insertForm.addChild("input", new String[] { "type", "name", "maxlength" }, new String[] { "text", "overrideSplitfileKey", "64" }); } insertForm.addChild("br"); insertForm.addChild("br"); // Local file browser if (ctx.isAllowedFullAccess()) { insertForm.addChild("#", NodeL10n.getBase().getString("QueueToadlet.insertFileBrowseLabel")+": "); insertForm.addChild("input", new String[] { "type", "name", "value" }, new String[] { "submit", "insert-local", NodeL10n.getBase().getString("QueueToadlet.insertFileBrowseButton") + "..." }); insertForm.addChild("br"); } insertForm.addChild("#", NodeL10n.getBase().getString("QueueToadlet.insertFileLabel") + ": "); insertForm.addChild("input", new String[] { "type", "name", "value" }, new String[] { "file", "filename", "" }); insertForm.addChild("#", " \u00a0 "); insertForm.addChild("input", new String[] { "type", "name", "value" }, new String[] { "submit", "insert", NodeL10n.getBase().getString("QueueToadlet.insertFileInsertFileLabel") }); insertForm.addChild("#", " \u00a0 "); return insertBox; } private HTMLNode createFilterBox (PageMaker pageMaker, ToadletContext ctx) { /* the insert file box */ InfoboxNode infobox = pageMaker.getInfobox( l10n("previewFilterFile"), "insert-queue", true); HTMLNode insertBox = infobox.outer; HTMLNode insertContent = infobox.content; HTMLNode insertForm = ctx.addFormChild(insertContent, ContentFilterToadlet.PATH, "filterPreviewForm"); insertForm.addChild("#", l10n("filterFileLabel")); insertForm.addChild("br"); insertForm.addChild("br"); // apply read filter, write filter, or both //TODO: radio buttons to select, once ContentFilter supports write filtering insertForm.addChild("input", new String[] { "type", "name", "value" }, new String[] { "hidden", "filter-operation", FilterOperation.BOTH.toString() }); // display in browser or save to disk insertForm.addChild("input", new String[] { "type", "name", "value" }, new String[] { "radio", "result-handling", ResultHandling.DISPLAY.toString() }); insertForm.addChild("#", ContentFilterToadlet.l10n("displayResultLabel")); insertForm.addChild("br"); insertForm.addChild("input", new String[] { "type", "name", "value" }, new String[] { "radio", "result-handling", ResultHandling.SAVE.toString() }); insertForm.addChild("#", ContentFilterToadlet.l10n("saveResultLabel")); insertForm.addChild("br"); insertForm.addChild("br"); // mime type insertForm.addChild("#", ContentFilterToadlet.l10n("mimeTypeLabel") + ": "); insertForm.addChild("input", new String[] { "type", "name", "value" }, new String[] { "text", "mime-type", "" }); insertForm.addChild("br"); insertForm.addChild("#", ContentFilterToadlet.l10n("mimeTypeText")); insertForm.addChild("br"); insertForm.addChild("br"); // Local file browser if (ctx.isAllowedFullAccess()) { insertForm.addChild("#", NodeL10n.getBase().getString("QueueToadlet.insertFileBrowseLabel")+": "); insertForm.addChild("input", new String[] { "type", "name", "value" }, new String[] { "submit", "filter-local", NodeL10n.getBase().getString("QueueToadlet.insertFileBrowseButton") + "..." }); insertForm.addChild("br"); } insertForm.addChild("#", NodeL10n.getBase().getString("QueueToadlet.insertFileLabel") + ": "); insertForm.addChild("input", new String[] { "type", "name", "value" }, new String[] { "file", "filename", "" }); insertForm.addChild("#", " \u00a0 "); insertForm.addChild("input", new String[] { "type", "name", "value" }, new String[] { "submit", "filter-upload", ContentFilterToadlet.l10n("filterFileFilterLabel") }); return insertBox; } String l10n (String key) { return NodeL10n.getBase().getString("FileInsertWizardToadlet."+key); } String l10n (String key, String pattern, String value) { return NodeL10n.getBase().getString("FileInsertWizardToadlet."+key, pattern, value); } @Override public boolean isEnabled (ToadletContext ctx) { return (!container.publicGatewayMode()) || ((ctx != null) && ctx.isAllowedFullAccess()); } }