package org.torproject.jtor.control.commands; import java.util.HashMap; import java.util.Iterator; import org.torproject.jtor.TorConfig; import org.torproject.jtor.config.impl.TorConfigParser; import org.torproject.jtor.control.ControlConnectionHandler; import org.torproject.jtor.control.KeyNotFoundException; public class ControlCommandSetConf { public static boolean handleSetConf(ControlConnectionHandler cch, String in) { String[] confs = in.split(" "); HashMap<String, String> oldvals = new HashMap<String, String>(); for (int i = 0; i < confs.length; i++) { String key, value = ""; if (confs[i].indexOf("=") < 0) { // only a key key = confs[i]; } else { key = confs[i].substring(0, confs[i].indexOf("=")); value = confs[i].substring(confs[i].indexOf("=")+1); } boolean success; try { oldvals.put(key, ControlCommandGetConf.handleGetConf(cch, key)); // TODO reset options that can be specified multiple times if (value == null || value.equals("")) { // set the default value setDefaultConf(cch, key); success = true; } else { //replace with new value success = TorConfigParser.setConf(cch.getControlServer().getTorConfig(), key, value); } } catch (KeyNotFoundException e) { cch.getControlServer().getLogger().warning("Control command setconf key not found: " + key); success = false; } if (!success) { //restore all settings done by this command because one has failed Iterator<String> it = oldvals.keySet().iterator(); while (it.hasNext()) { String oldkey = (String)it.next(); String oldval = (String)oldvals.get(oldkey); TorConfigParser.setConf(cch.getControlServer().getTorConfig(), oldkey, oldval); } cch.write("552 Unrecognized option"); return false; } } cch.write("250 configuration values set"); return true; } public static void setDefaultConf(ControlConnectionHandler cch, String key) throws KeyNotFoundException { TorConfig tc = cch.getControlServer().getTorConfig(); key = key.toLowerCase(); if (key.equals("configfile")) { tc.setDefaultConfigFile(); } else if (key.equals("datadirectory")) { tc.setDefaultDataDirectory(); } else if (key.equals("bandwidthrate")) { tc.setDefaultBandwidthRate(); } else if (key.equals("bandwidthburst")) { tc.setDefaultBandwidthBurst(); } else if (key.equals("maxadvertisedbandwidth")) { tc.setDefaultMaxAdvertisedBandwidth(); } else if (key.equals("controlport")) { tc.setDefaultControlPort(); } else if (key.equals("hashedcontrolpassword")) { tc.setDefaultHashedControlPassword(); } else if (key.equals("cookieauthentication")) { tc.isCookieAuthentication(); } else if (key.equals("dirfetchperiod")) { tc.setDefaultDirFetchPeriod(); } else if (key.equals("dirserver")) { tc.setDefaultDirServer(); } else if (key.equals("tunneldirconns")) { tc.setDefaultTunnelDirConns(); } else if (key.equals("prefertunneleddirconns")) { tc.setDefaultPreferTunneledDirConns(); } else if (key.equals("disableallswap")) { tc.setDefaultDisableAllSwap(); } else if (key.equals("group")) { tc.setDefaultGroup(); } else if (key.equals("httpproxy")) { tc.setDefaultHttpProxy(); } else if (key.equals("httpproxyauthenticator")) { tc.setDefaultHttpProxyAuthenticator(); } else if (key.equals("httpsproxy")) { tc.setDefaultHttpsProxy(); } else if (key.equals("httpsproxyauthenticator")) { tc.setDefaultHttpsProxyAuthenticator(); } else if (key.equals("keepaliveperiod")) { tc.setDefaultKeepalivePeriod(); } else if (key.equals("log")) { tc.setDefaultLog(); } else if (key.equals("maxconn")) { tc.setDefaultMaxConn(); } else if (key.equals("outboundbindaddress")) { tc.setDefaultOutboundBindAddress(); } else if (key.equals("pidfile")) { tc.setDefaultPidFile(); } else if (key.equals("runasdaemon")) { tc.setDefaultRunAsDaemon(); } else if (key.equals("safelogging")) { tc.setDefaultSafeLogging(); } else if (key.equals("statusfetchperiod")) { tc.setDefaultStatusFetchPeriod(); } else if (key.equals("user")) { tc.setDefaultUser(); } else if (key.equals("hardwareaccel")) { tc.setDefaultHardwareAccel(); } else if (key.equals("allowunverifiednodes")) { tc.setDefaultAllowUnverifiedNodes(); } else if (key.equals("clientonly")) { tc.setDefaultClientOnly(); } else if (key.equals("entrynodes")) { tc.setDefaultEntryNodes(); } else if (key.equals("exitnodes")) { tc.setDefaultExitNodes(); } else if (key.equals("excludenodes")) { tc.setDefaultExcludeNodes(); } else if (key.equals("strictexitnodes")) { tc.setDefaultStrictExitNodes(); } else if (key.equals("strictentrynodes")) { tc.setDefaultStrictEntryNodes(); } else if (key.equals("fascistfirewall")) { tc.setDefaultFascistFirewall(); } else if (key.equals("firewallports")) { tc.setDefaultFirewallPorts(); } else if (key.equals("firewallips")) { tc.setDefaultFirewallIPs(); } else if (key.equals("reachableaddresses")) { tc.setDefaultReachableAddresses(); } else if (key.equals("longlivedports")) { tc.setDefaultLongLivedPorts(); } else if (key.equals("mapaddress")) { tc.setDefaultMapAddress(); } else if (key.equals("newcircuitperiod")) { tc.setDefaultNewCircuitPeriod(); } else if (key.equals("maxcircuitdirtiness")) { tc.setDefaultMaxCircuitDirtiness(); } else if (key.equals("nodefamily")) { tc.setDefaultNodeFamily(); } else if (key.equals("rendnodes")) { tc.setDefaultRendNodes(); } else if (key.equals("rendexcludenodes")) { tc.setDefaultRendExcludeNodes(); } else if (key.equals("socksport")) { tc.setDefaultSocksPort(); } else if (key.equals("socksbindaddress")) { tc.setDefaultSocksBindAddress(); } else if (key.equals("sockslistenaddress")) { tc.setDefaultSocksBindAddress(); } else if (key.equals("sockspolicy")) { tc.setDefaultSocksPolicy(); } else if (key.equals("trackhostexits")) { tc.setDefaultTrackHostExits(); } else if (key.equals("trackhostexitsexpire")) { tc.setDefaultTrackHostExitsExpire(); } else if (key.equals("usehelpernodes")) { tc.setDefaultUseHelperNodes(); } else if (key.equals("numhelpernodes")) { tc.setDefaultNumHelperNodes(); } else if (key.equals("hiddenservicedir")) { tc.setDefaultHiddenServiceDir(); } else if (key.equals("hiddenserviceport")) { tc.setDefaultHiddenServicePort(); } else if (key.equals("hiddenservicenodes")) { tc.setDefaultHiddenServiceNodes(); } else if (key.equals("hiddenserviceexcludenodes")) { tc.setDefaultHiddenServiceExcludeNodes(); } else if (key.equals("hiddenserviceversion")) { tc.setDefaultHiddenServiceVersion(); } else if (key.equals("rendpostperiod")) { tc.setDefaultRendPostPeriod(); } else if (key.equals("__alldiroptionsprivate")) { tc.setDefault__AllDirOptionsPrivate(); } else if (key.equals("__disablepredictedcircuits")) { tc.setDefault__DisablePredictedCircuits(); } else if (key.equals("__leavestreamsunattached")) { tc.setDefault__LeaveStreamsUnattached(); } else if (key.equals("__hashedcontrolsessionpassword")) { tc.setDefault__HashedControlSessionPassword(); } else if (key.equals("__reloadtorrconsighup")) { tc.setDefault__ReloadTorrcOnSIGHUP(); } else { throw new KeyNotFoundException(); } } }