package net.i2p.router.web;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import net.i2p.data.DataHelper;
/** set the theme */
public class ConfigUIHandler extends FormHandler {
private boolean _shouldSave;
private boolean _universalTheming;
private boolean _forceMobileConsole;
private String _config;
@Override
protected void processForm() {
if (_shouldSave) {
saveChanges();
} else if (_action.equals(_t("Delete selected"))) {
delUser();
} else if (_action.equals(_t("Add user"))) {
addUser();
}
}
public void setShouldsave(String moo) { _shouldSave = true; }
public void setUniversalTheming(String baa) { _universalTheming = true; }
public void setForceMobileConsole(String baa) { _forceMobileConsole = true; }
public void setTheme(String val) {
_config = val;
}
/** note - lang change is handled in CSSHelper but we still need to save it here */
private void saveChanges() {
if (_config == null || _config.length() <= 0)
return;
if (_config.replaceAll("[a-zA-Z0-9_-]", "").length() != 0) {
addFormError("Bad theme name");
return;
}
Map<String, String> changes = new HashMap<String, String>();
List<String> removes = new ArrayList<String>();
String oldTheme = _context.getProperty(CSSHelper.PROP_THEME_NAME, CSSHelper.DEFAULT_THEME);
boolean oldForceMobileConsole = _context.getBooleanProperty(CSSHelper.PROP_FORCE_MOBILE_CONSOLE);
if (_config.equals("default")) // obsolete
removes.add(CSSHelper.PROP_THEME_NAME);
else
changes.put(CSSHelper.PROP_THEME_NAME, _config);
if (_universalTheming)
changes.put(CSSHelper.PROP_UNIVERSAL_THEMING, "true");
else
removes.add(CSSHelper.PROP_UNIVERSAL_THEMING);
if (_forceMobileConsole)
changes.put(CSSHelper.PROP_FORCE_MOBILE_CONSOLE, "true");
else
removes.add(CSSHelper.PROP_FORCE_MOBILE_CONSOLE);
boolean ok = _context.router().saveConfig(changes, removes);
if (ok) {
if (!oldTheme.equals(_config))
addFormNoticeNoEscape(_t("Theme change saved.") +
" <a href=\"configui\">" +
_t("Refresh the page to view.") +
"</a>");
if (oldForceMobileConsole != _forceMobileConsole)
addFormNoticeNoEscape(_t("Mobile console option saved.") +
" <a href=\"configui\">" +
_t("Refresh the page to view.") +
"</a>");
} else {
addFormError(_t("Error saving the configuration (applied but not saved) - please see the error logs."));
}
}
private void addUser() {
String name = getJettyString("name");
if (name == null || name.length() <= 0) {
addFormError(_t("No user name entered"));
return;
}
// XSS filters # and ; but not =
// We store the username as the part of an option key, so we can't handle '='
if (name.contains("=")) {
addFormError("User name may not contain '='");
return;
}
byte[] b1 = DataHelper.getUTF8(name);
byte[] b2 = DataHelper.getASCII(name);
if (!DataHelper.eq(b1, b2))
addFormError(_t("Warning: User names outside the ISO-8859-1 character set are not recommended. Support is not standardized and varies by browser."));
String pw = getJettyString("nofilter_pw");
if (pw == null || pw.length() <= 0) {
addFormError(_t("No password entered"));
return;
}
ConsolePasswordManager mgr = new ConsolePasswordManager(_context);
// rfc 2617
if (mgr.saveMD5(RouterConsoleRunner.PROP_CONSOLE_PW, RouterConsoleRunner.JETTY_REALM, name, pw)) {
if (!_context.getBooleanProperty(RouterConsoleRunner.PROP_PW_ENABLE))
_context.router().saveConfig(RouterConsoleRunner.PROP_PW_ENABLE, "true");
addFormNotice(_t("Added user {0}", name));
addFormNotice(_t("To recover from a forgotten or non-working password, stop I2P, edit the file {0}, delete the line {1}, and restart I2P.",
_context.router().getConfigFilename(), RouterConsoleRunner.PROP_PW_ENABLE + "=true"));
addFormError(_t("Restart required to take effect"));
} else {
addFormError(_t("Error saving the configuration (applied but not saved) - please see the error logs."));
}
}
private void delUser() {
ConsolePasswordManager mgr = new ConsolePasswordManager(_context);
boolean success = false;
for (Object o : _settings.keySet()) {
if (!(o instanceof String))
continue;
String k = (String) o;
if (!k.startsWith("delete_"))
continue;
k = k.substring(7);
if (mgr.remove(RouterConsoleRunner.PROP_CONSOLE_PW, k)) {
addFormNotice(_t("Removed user {0}", k));
success = true;
} else {
addFormError(_t("Error saving the configuration (applied but not saved) - please see the error logs."));
}
}
if (success)
addFormError(_t("Restart required to take effect"));
}
}