fixes for tor setConf/control port

fixes hidden service support
manages socks port conflicts
This commit is contained in:
Nathan Freitas 2014-06-06 09:59:10 -04:00
parent 93451865f8
commit da3c95575a
4 changed files with 66 additions and 31 deletions

View File

@ -257,4 +257,8 @@
<string name="network_connectivity_is_good_waking_tor_up_">Network connectivity is good. Waking Tor up...</string> <string name="network_connectivity_is_good_waking_tor_up_">Network connectivity is good. Waking Tor up...</string>
<string name="updating_settings_in_tor_service">updating settings in Tor service</string> <string name="updating_settings_in_tor_service">updating settings in Tor service</string>
<string name="pref_socks_title">Tor SOCKS</string>
<string name="pref_socks_summary">IP and Port that Tor offers its SOCKS proxy on (default: 9050)</string>
<string name="pref_socks_dialog">SOCKS Config (ip:port)</string>
</resources> </resources>

View File

@ -196,6 +196,14 @@ android:dialogTitle="@string/pref_proxy_password_dialog"
</PreferenceCategory> </PreferenceCategory>
<PreferenceCategory android:title="Debug"> <PreferenceCategory android:title="Debug">
<EditTextPreference android:key="pref_socks"
android:title="@string/pref_socks_title"
android:summary="@string/pref_socks_summary"
android:dialogTitle="@string/pref_socks_dialog"
android:defaultValue="auto"
/>
<CheckBoxPreference <CheckBoxPreference
android:key="pref_enable_logging" android:key="pref_enable_logging"
android:defaultValue="false" android:defaultValue="false"

View File

@ -56,4 +56,6 @@ public interface TorConstants {
public final static int MAX_LOG_LENGTH = 10000; public final static int MAX_LOG_LENGTH = 10000;
public final static String PREF_SOCKS = "pref_socks";
} }

View File

@ -71,6 +71,7 @@ public class TorService extends Service implements TorServiceConstants, TorConst
private TorControlConnection conn = null; private TorControlConnection conn = null;
private Socket torConnSocket = null; private Socket torConnSocket = null;
private int mLastProcessId = -1; private int mLastProcessId = -1;
private int mSocksPort = 9050;
private static final int NOTIFY_ID = 1; private static final int NOTIFY_ID = 1;
private static final int TRANSPROXY_NOTIFY_ID = 2; private static final int TRANSPROXY_NOTIFY_ID = 2;
@ -81,8 +82,8 @@ public class TorService extends Service implements TorServiceConstants, TorConst
private static final int MAX_START_TRIES = 3; private static final int MAX_START_TRIES = 3;
private LinkedHashMap<String,String> configBuffer = null; private ArrayList<String> configBuffer = null;
private LinkedHashMap<String,String> resetBuffer = null; private ArrayList<String> resetBuffer = null;
// private String appHome; // private String appHome;
private File appBinHome; private File appBinHome;
@ -121,6 +122,7 @@ public class TorService extends Service implements TorServiceConstants, TorConst
public void logMessage(String msg) public void logMessage(String msg)
{ {
if (ENABLE_DEBUG_LOG) if (ENABLE_DEBUG_LOG)
{ {
Log.d(TAG,msg); Log.d(TAG,msg);
sendCallbackLogMessage(msg); sendCallbackLogMessage(msg);
@ -154,8 +156,6 @@ public class TorService extends Service implements TorServiceConstants, TorConst
sendCallbackLogMessage (getString(R.string.found_existing_tor_process)); sendCallbackLogMessage (getString(R.string.found_existing_tor_process));
processSettingsImpl();
String state = conn.getInfo("dormant"); String state = conn.getInfo("dormant");
if (state != null && Integer.parseInt(state) == 0) if (state != null && Integer.parseInt(state) == 0)
currentStatus = STATUS_ON; currentStatus = STATUS_ON;
@ -892,9 +892,9 @@ public class TorService extends Service implements TorServiceConstants, TorConst
catch (Exception ce) catch (Exception ce)
{ {
conn = null; conn = null;
logNotice( "Error connecting to Tor local control port: " + ce.getLocalizedMessage()); logNotice( "Error connecting to Tor local control port");
Log.d(TAG,"Attempt: Error connecting to control port: " + ce.getLocalizedMessage(),ce); //Log.d(TAG,"Attempt: Error connecting to control port: " + ce.getLocalizedMessage(),ce);
} }
@ -990,7 +990,7 @@ public class TorService extends Service implements TorServiceConstants, TorConst
* Returns the port number that the SOCKS proxy is running on * Returns the port number that the SOCKS proxy is running on
*/ */
public int getSOCKSPort() throws RemoteException { public int getSOCKSPort() throws RemoteException {
return TorServiceConstants.PORT_SOCKS; return mSocksPort;
} }
@ -1318,9 +1318,10 @@ public class TorService extends Service implements TorServiceConstants, TorConst
} }
public void processSettings () public void processSettings ()
{ {
/*
Thread thread = new Thread() Thread thread = new Thread()
{ {
@ -1338,6 +1339,7 @@ public class TorService extends Service implements TorServiceConstants, TorConst
}; };
thread.start(); thread.start();
*/
} }
@ -1394,25 +1396,31 @@ public class TorService extends Service implements TorServiceConstants, TorConst
return null; return null;
} }
private final static String RESET_STRING = "=\"\"";
/** /**
* Set configuration * Set configuration
**/ **/
public boolean updateConfiguration (String name, String value, boolean saveToDisk) public boolean updateConfiguration (String name, String value, boolean saveToDisk)
{ {
if (configBuffer == null) if (configBuffer == null)
configBuffer = new LinkedHashMap<String,String>(); configBuffer = new ArrayList<String>();
if (resetBuffer == null) if (resetBuffer == null)
resetBuffer = new LinkedHashMap<String,String>(); resetBuffer = new ArrayList<String>();
if (value == null || value.length() == 0) if (value == null || value.length() == 0)
{ {
resetBuffer.put(name,""); resetBuffer.add(name + RESET_STRING);
} }
else else
{ {
configBuffer.put(name,value); StringBuffer sbConf = new StringBuffer();
sbConf.append(name);
sbConf.append(' ');
sbConf.append(value);
configBuffer.add(sbConf.toString());
} }
return false; return false;
@ -1449,24 +1457,31 @@ public class TorService extends Service implements TorServiceConstants, TorConst
if (resetBuffer != null && resetBuffer.size() > 0) if (resetBuffer != null && resetBuffer.size() > 0)
{ {
conn.resetConf(resetBuffer.keySet()); for (String value : configBuffer)
{
logMessage("removing torrc conf: " + value);
}
conn.resetConf(resetBuffer);
resetBuffer = null; resetBuffer = null;
} }
if (configBuffer != null && configBuffer.size() > 0) if (configBuffer != null && configBuffer.size() > 0)
{ {
for (String key : configBuffer.keySet()) for (String value : configBuffer)
{ {
String value = configBuffer.get(key); logMessage("Setting torrc conf: " + value);
if (TorService.ENABLE_DEBUG_LOG)
logMessage("Setting conf: " + key + "=" + value);
conn.setConf(key, value);
} }
conn.setConf(configBuffer);
configBuffer = null; configBuffer = null;
} }
@ -1657,7 +1672,9 @@ public class TorService extends Service implements TorServiceConstants, TorConst
SharedPreferences prefs = TorServiceUtils.getSharedPrefs(getApplicationContext()); SharedPreferences prefs = TorServiceUtils.getSharedPrefs(getApplicationContext());
enableSocks ("127.0.0.1",9050,false); String socksConfig = prefs.getString(TorConstants.PREF_SOCKS, "auto");
enableSocks (socksConfig,false);
boolean useBridges = prefs.getBoolean(TorConstants.PREF_BRIDGES_ENABLED, false); boolean useBridges = prefs.getBoolean(TorConstants.PREF_BRIDGES_ENABLED, false);
@ -1859,7 +1876,7 @@ public class TorService extends Service implements TorServiceConstants, TorConst
{ {
logNotice("hidden services are enabled"); logNotice("hidden services are enabled");
mBinder.updateConfiguration("HiddenServiceDir",appCacheHome.getAbsolutePath(), false);
//mBinder.updateConfiguration("RendPostPeriod", "600 seconds", false); //possible feature to investigate //mBinder.updateConfiguration("RendPostPeriod", "600 seconds", false); //possible feature to investigate
String hsPorts = prefs.getString("pref_hs_ports",""); String hsPorts = prefs.getString("pref_hs_ports","");
@ -1872,15 +1889,19 @@ public class TorService extends Service implements TorServiceConstants, TorConst
{ {
try try
{ {
hsPortConfig = st.nextToken(); hsPortConfig = st.nextToken().trim();
if (hsPortConfig.indexOf(":")==-1) //setup the port to localhost if not specifed if (hsPortConfig.indexOf(":")==-1) //setup the port to localhost if not specifed
{ {
hsPortConfig = hsPortConfig + " 0.0.0.0:" + hsPortConfig; hsPortConfig = hsPortConfig + " 127.0.0.1:" + hsPortConfig;
} }
logMessage("Adding hidden service on port: " + hsPortConfig); logMessage("Adding hidden service on port: " + hsPortConfig);
//String hsDirPath = new File(appCacheHome,"hs" + hsPortConfig).getAbsolutePath();
String hsDirPath = appCacheHome.getAbsolutePath();
mBinder.updateConfiguration("HiddenServiceDir",hsDirPath, false);
mBinder.updateConfiguration("HiddenServicePort",hsPortConfig, false); mBinder.updateConfiguration("HiddenServicePort",hsPortConfig, false);
hsPort = Integer.parseInt(hsPortConfig.split(" ")[0]); hsPort = Integer.parseInt(hsPortConfig.split(" ")[0]);
@ -1905,9 +1926,9 @@ public class TorService extends Service implements TorServiceConstants, TorConst
return true; return true;
} }
private void enableSocks (String ip, int port, boolean safeSocks) throws RemoteException private void enableSocks (String socks, boolean safeSocks) throws RemoteException
{ {
mBinder.updateConfiguration("SOCKSPort", ip + ":" + port + "", false); mBinder.updateConfiguration("SOCKSPort", socks, false);
mBinder.updateConfiguration("SafeSocks", safeSocks ? "1" : "0", false); mBinder.updateConfiguration("SafeSocks", safeSocks ? "1" : "0", false);
mBinder.updateConfiguration("TestSocks", "1", false); mBinder.updateConfiguration("TestSocks", "1", false);
mBinder.updateConfiguration("WarnUnsafeSocks", "1", false); mBinder.updateConfiguration("WarnUnsafeSocks", "1", false);