package freenet.clients.http.wizardsteps;
import freenet.clients.http.FirstTimeWizardToadlet;
import freenet.l10n.NodeL10n;
import freenet.node.NodeClientCore;
import freenet.node.SecurityLevels;
import freenet.support.Fields;
import freenet.support.HTMLNode;
import freenet.support.api.HTTPRequest;
/**
* This step allows the user to choose between security levels. If opennet is disabled, only high and maximum are shown.
* If opennet is enabled, only low and normal are shown.
*/
public class SECURITY_NETWORK implements Step {
private final NodeClientCore core;
public SECURITY_NETWORK(NodeClientCore core) {
this.core = core;
}
@Override
public void getStep(HTTPRequest request, PageHelper helper) {
HTMLNode contentNode = helper.getPageContent(WizardL10n.l10n("networkSecurityPageTitle"));
String opennetParam = request.getParam("opennet", "false");
boolean opennet = Fields.stringToBool(opennetParam, false);
if (request.isParameterSet("confirm")) {
String networkThreatLevel = request.getParam("security-levels.networkThreatLevel");
SecurityLevels.NETWORK_THREAT_LEVEL newThreatLevel = SecurityLevels.parseNetworkThreatLevel(networkThreatLevel);
HTMLNode infoboxContent = helper.getInfobox("infobox-information",
WizardL10n.l10n("networkThreatLevelConfirmTitle."+newThreatLevel), contentNode, null, false);
HTMLNode formNode = helper.addFormChild(infoboxContent, ".", "configFormSecLevels");
formNode.addChild("input",
new String[] { "type", "name", "value" },
new String[] { "hidden", "security-levels.networkThreatLevel", networkThreatLevel });
if(newThreatLevel == SecurityLevels.NETWORK_THREAT_LEVEL.MAXIMUM) {
HTMLNode p = formNode.addChild("p");
NodeL10n.getBase().addL10nSubstitution(p, "SecurityLevels.maximumNetworkThreatLevelWarning",
new String[] { "bold" },
new HTMLNode[] { HTMLNode.STRONG });
p.addChild("#", " ");
NodeL10n.getBase().addL10nSubstitution(p, "SecurityLevels.maxSecurityYouNeedFriends",
new String[] { "bold" },
new HTMLNode[] { HTMLNode.STRONG });
formNode.addChild("p").addChild("input",
new String[] { "type", "name", "value" },
new String[] { "checkbox", "security-levels.networkThreatLevel.confirm", "off" },
WizardL10n.l10nSec("maximumNetworkThreatLevelCheckbox"));
} else /*if(newThreatLevel == NETWORK_THREAT_LEVEL.HIGH)*/ {
HTMLNode p = formNode.addChild("p");
NodeL10n.getBase().addL10nSubstitution(p, "FirstTimeWizardToadlet.highNetworkThreatLevelWarning",
new String[] { "bold", "addAFriend", "friends" },
new HTMLNode[] { HTMLNode.STRONG,
new HTMLNode("#", NodeL10n.getBase().getString("FProxyToadlet.addFriendTitle")),
new HTMLNode("#", NodeL10n.getBase().getString("FProxyToadlet.categoryFriends"))});
HTMLNode checkbox = formNode.addChild("p").addChild("input",
new String[] { "type", "name", "value" },
new String[] { "checkbox", "security-levels.networkThreatLevel.confirm", "off" });
NodeL10n.getBase().addL10nSubstitution(checkbox,
"FirstTimeWizardToadlet.highNetworkThreatLevelCheckbox",
new String[] { "bold", "addAFriend" },
new HTMLNode[] { HTMLNode.STRONG,
new HTMLNode("#", NodeL10n.getBase().getString("FProxyToadlet.addFriendTitle")),});
}
formNode.addChild("input",
new String[] { "type", "name", "value" },
new String[] { "hidden", "security-levels.networkThreatLevel.tryConfirm", "on" });
formNode.addChild("input",
new String[] { "type", "name", "value" },
new String[] { "submit", "return-from-confirm", NodeL10n.getBase().getString("Toadlet.back")});
formNode.addChild("input",
new String[] { "type", "name", "value" },
new String[] { "submit", "next", NodeL10n.getBase().getString("Toadlet.next")});
return;
}
//Add choices and description depending on whether opennet was selected.
HTMLNode form;
if(opennet) {
HTMLNode infoboxContent = helper.getInfobox("infobox-normal",
WizardL10n.l10n("networkThreatLevelHeaderOpennet"), contentNode, null, false);
infoboxContent.addChild("p", WizardL10n.l10n("networkThreatLevelIntroOpennet"));
form = helper.addFormChild(infoboxContent, ".", "networkSecurityForm");
HTMLNode div = form.addChild("div", "class", "opennetDiv");
for(SecurityLevels.NETWORK_THREAT_LEVEL level : SecurityLevels.NETWORK_THREAT_LEVEL.getOpennetValues()) {
securityLevelChoice(div, level);
}
} else {
HTMLNode infoboxContent = helper.getInfobox("infobox-normal",
WizardL10n.l10n("networkThreatLevelHeaderDarknet"), contentNode, null, false);
infoboxContent.addChild("p", WizardL10n.l10n("networkThreatLevelIntroDarknet"));
form = helper.addFormChild(infoboxContent, ".", "networkSecurityForm");
HTMLNode div = form.addChild("div", "class", "darknetDiv");
for(SecurityLevels.NETWORK_THREAT_LEVEL level : SecurityLevels.NETWORK_THREAT_LEVEL.getDarknetValues()) {
securityLevelChoice(div, level);
}
form.addChild("p").addChild("b", WizardL10n.l10nSec("networkThreatLevel.opennetFriendsWarning"));
}
form.addChild("input",
new String[] { "type", "name", "value" },
new String[] { "submit", "back", NodeL10n.getBase().getString("Toadlet.back")});
form.addChild("input",
new String[] { "type", "name", "value" },
new String[] { "submit", "next", NodeL10n.getBase().getString("Toadlet.next")});
}
/**
* Adds to the given parent node description and a radio button for the selected security level.
* @param parent to add content to.
* @param level to add content about.
*/
private void securityLevelChoice(HTMLNode parent, SecurityLevels.NETWORK_THREAT_LEVEL level) {
HTMLNode input = parent.addChild("p").addChild("input",
new String[] { "type", "name", "value" },
new String[] { "radio", "security-levels.networkThreatLevel", level.name() });
input.addChild("b", WizardL10n.l10nSec("networkThreatLevel.name."+level));
input.addChild("#", ": ");
NodeL10n.getBase().addL10nSubstitution(input, "SecurityLevels.networkThreatLevel.choice."+level,
new String[] { "bold" },
new HTMLNode[] { HTMLNode.STRONG });
HTMLNode inner = input.addChild("p").addChild("i");
NodeL10n.getBase().addL10nSubstitution(inner, "SecurityLevels.networkThreatLevel.desc."+level,
new String[] { "bold" },
new HTMLNode[] { HTMLNode.STRONG });
}
@Override
public String postStep(HTTPRequest request) {
String networkThreatLevel = request.getPartAsStringFailsafe("security-levels.networkThreatLevel", 128);
SecurityLevels.NETWORK_THREAT_LEVEL newThreatLevel = SecurityLevels.parseNetworkThreatLevel(networkThreatLevel);
//Used in case of redirect either for retry or confirmation.
StringBuilder redirectTo = new StringBuilder(FirstTimeWizardToadlet.WIZARD_STEP.SECURITY_NETWORK.name());
/*If the user didn't select a network security level before clicking continue or the selected
* security level could not be determined, redirect to the same page.*/
if(newThreatLevel == null || !request.isPartSet("security-levels.networkThreatLevel")) {
return redirectTo.toString();
}
PersistFields persistFields = new PersistFields(request);
boolean isInPreset = persistFields.isUsingPreset();
if (request.isPartSet("return-from-confirm")) {
//User clicked back from a confirmation page
if (isInPreset) {
//In a preset, go back a step
return FirstTimeWizardToadlet.getPreviousStep(
FirstTimeWizardToadlet.WIZARD_STEP.SECURITY_NETWORK, persistFields.preset).name();
}
//Not in a preset, redisplay level choice.
return FirstTimeWizardToadlet.WIZARD_STEP.SECURITY_NETWORK.name();
}
if((newThreatLevel == SecurityLevels.NETWORK_THREAT_LEVEL.MAXIMUM || newThreatLevel == SecurityLevels.NETWORK_THREAT_LEVEL.HIGH)) {
//Make the user aware of the effects of high or maximum network threat if selected.
//They must check a box acknowledging its affects to proceed.
if((!request.isPartSet("security-levels.networkThreatLevel.confirm")) &&
(!request.isPartSet("security-levels.networkThreatLevel.tryConfirm"))) {
displayConfirmationBox(redirectTo, networkThreatLevel);
return redirectTo.toString();
} else if((!request.isPartSet("security-levels.networkThreatLevel.confirm")) &&
request.isPartSet("security-levels.networkThreatLevel.tryConfirm")) {
//If the user did not check the box and clicked next, redisplay the prompt.
displayConfirmationBox(redirectTo, networkThreatLevel);
return redirectTo.toString();
}
}
//The user selected low or normal security, or confirmed high or maximum. Set the configuration
//and continue to the physical security step.
setThreatLevel(newThreatLevel);
return FirstTimeWizardToadlet.WIZARD_STEP.SECURITY_PHYSICAL.name();
}
private void displayConfirmationBox(StringBuilder redirectTo, String networkThreatLevel) {
redirectTo.append("&confirm=true&security-levels.networkThreatLevel=").append(networkThreatLevel);
}
public void setThreatLevel(SecurityLevels.NETWORK_THREAT_LEVEL level) {
core.node.securityLevels.setThreatLevel(level);
core.storeConfig();
}
}