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="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>

View File

@ -196,6 +196,14 @@ android:dialogTitle="@string/pref_proxy_password_dialog"
</PreferenceCategory>
<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
android:key="pref_enable_logging"
android:defaultValue="false"

View File

@ -56,4 +56,6 @@ public interface TorConstants {
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 Socket torConnSocket = null;
private int mLastProcessId = -1;
private int mSocksPort = 9050;
private static final int NOTIFY_ID = 1;
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 LinkedHashMap<String,String> configBuffer = null;
private LinkedHashMap<String,String> resetBuffer = null;
private ArrayList<String> configBuffer = null;
private ArrayList<String> resetBuffer = null;
// private String appHome;
private File appBinHome;
@ -121,6 +122,7 @@ public class TorService extends Service implements TorServiceConstants, TorConst
public void logMessage(String msg)
{
if (ENABLE_DEBUG_LOG)
{
Log.d(TAG,msg);
sendCallbackLogMessage(msg);
@ -154,8 +156,6 @@ public class TorService extends Service implements TorServiceConstants, TorConst
sendCallbackLogMessage (getString(R.string.found_existing_tor_process));
processSettingsImpl();
String state = conn.getInfo("dormant");
if (state != null && Integer.parseInt(state) == 0)
currentStatus = STATUS_ON;
@ -892,9 +892,9 @@ public class TorService extends Service implements TorServiceConstants, TorConst
catch (Exception ce)
{
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
*/
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 ()
{
/*
Thread thread = new Thread()
{
@ -1338,6 +1339,7 @@ public class TorService extends Service implements TorServiceConstants, TorConst
};
thread.start();
*/
}
@ -1394,25 +1396,31 @@ public class TorService extends Service implements TorServiceConstants, TorConst
return null;
}
private final static String RESET_STRING = "=\"\"";
/**
* Set configuration
**/
public boolean updateConfiguration (String name, String value, boolean saveToDisk)
{
if (configBuffer == null)
configBuffer = new LinkedHashMap<String,String>();
configBuffer = new ArrayList<String>();
if (resetBuffer == null)
resetBuffer = new LinkedHashMap<String,String>();
resetBuffer = new ArrayList<String>();
if (value == null || value.length() == 0)
{
resetBuffer.put(name,"");
resetBuffer.add(name + RESET_STRING);
}
else
{
configBuffer.put(name,value);
StringBuffer sbConf = new StringBuffer();
sbConf.append(name);
sbConf.append(' ');
sbConf.append(value);
configBuffer.add(sbConf.toString());
}
return false;
@ -1449,24 +1457,31 @@ public class TorService extends Service implements TorServiceConstants, TorConst
if (resetBuffer != null && resetBuffer.size() > 0)
{
conn.resetConf(resetBuffer.keySet());
for (String value : configBuffer)
{
logMessage("removing torrc conf: " + value);
}
conn.resetConf(resetBuffer);
resetBuffer = null;
}
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;
}
@ -1657,7 +1672,9 @@ public class TorService extends Service implements TorServiceConstants, TorConst
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);
@ -1859,7 +1876,7 @@ public class TorService extends Service implements TorServiceConstants, TorConst
{
logNotice("hidden services are enabled");
mBinder.updateConfiguration("HiddenServiceDir",appCacheHome.getAbsolutePath(), false);
//mBinder.updateConfiguration("RendPostPeriod", "600 seconds", false); //possible feature to investigate
String hsPorts = prefs.getString("pref_hs_ports","");
@ -1872,15 +1889,19 @@ public class TorService extends Service implements TorServiceConstants, TorConst
{
try
{
hsPortConfig = st.nextToken();
hsPortConfig = st.nextToken().trim();
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);
//String hsDirPath = new File(appCacheHome,"hs" + hsPortConfig).getAbsolutePath();
String hsDirPath = appCacheHome.getAbsolutePath();
mBinder.updateConfiguration("HiddenServiceDir",hsDirPath, false);
mBinder.updateConfiguration("HiddenServicePort",hsPortConfig, false);
hsPort = Integer.parseInt(hsPortConfig.split(" ")[0]);
@ -1905,9 +1926,9 @@ public class TorService extends Service implements TorServiceConstants, TorConst
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("TestSocks", "1", false);
mBinder.updateConfiguration("WarnUnsafeSocks", "1", false);