don't kill Tor anymore; just reconnect to running instance!

This commit is contained in:
Nathan Freitas 2014-04-18 06:25:35 -04:00
parent 16f3a53529
commit 1295f5cd24
2 changed files with 92 additions and 113 deletions

View File

@ -136,25 +136,22 @@ public class TorService extends Service implements TorServiceConstants, TorConst
{ {
try try
{ {
int procId = TorServiceUtils.findProcessId(fileTor.getAbsolutePath());
if (procId != -1) int procId = initControlConnection(1);
{
logNotice("Found existing Tor process"); if (procId != -1)
{
sendCallbackLogMessage (getString(R.string.found_existing_tor_process)); sendCallbackLogMessage (getString(R.string.found_existing_tor_process));
currentStatus = STATUS_CONNECTING; processSettingsImpl();
initControlConnection();
processSettingsImpl();
currentStatus = STATUS_ON; currentStatus = STATUS_ON;
return true; return true;
}
}
return false; return false;
} }
@ -302,10 +299,9 @@ public class TorService extends Service implements TorServiceConstants, TorConst
setTorProfile(PROFILE_ON); setTorProfile(PROFILE_ON);
} }
} }
else if (intent == null) else
{ {
findExistingProc () ; findExistingProc();
} }
@ -338,14 +334,10 @@ public class TorService extends Service implements TorServiceConstants, TorConst
if (currentStatus == STATUS_CONNECTING) if (currentStatus == STATUS_CONNECTING)
{ {
boolean isRunning = findExistingProc ();
if (!isRunning)
{
try try
{ {
initTor(); initTor();
isRunning = true;
} }
catch (Exception e) catch (Exception e)
{ {
@ -355,7 +347,7 @@ public class TorService extends Service implements TorServiceConstants, TorConst
this.showToolbarNotification(getString(R.string.unable_to_start_tor) + ": " + e.getMessage(), ERROR_NOTIFY_ID, R.drawable.ic_stat_notifyerr, -1, false); this.showToolbarNotification(getString(R.string.unable_to_start_tor) + ": " + e.getMessage(), ERROR_NOTIFY_ID, R.drawable.ic_stat_notifyerr, -1, false);
Log.d(TAG,"Unable to start Tor: " + e.getMessage(),e); Log.d(TAG,"Unable to start Tor: " + e.getMessage(),e);
} }
}
} }
else if (currentStatus == STATUS_OFF) else if (currentStatus == STATUS_OFF)
{ {
@ -382,8 +374,6 @@ public class TorService extends Service implements TorServiceConstants, TorConst
{ {
currentStatus = STATUS_OFF; currentStatus = STATUS_OFF;
boolean hasRoot = getSharedPrefs(getApplicationContext()).getBoolean("has_root", false);
try try
{ {
killTorProcess (); killTorProcess ();
@ -392,11 +382,11 @@ public class TorService extends Service implements TorServiceConstants, TorConst
stopForeground(true); stopForeground(true);
currentStatus = STATUS_OFF; currentStatus = STATUS_OFF;
clearNotifications();
if (hasRoot) if (mHasRoot && mEnableTransparentProxy)
disableTransparentProxy(); disableTransparentProxy();
clearNotifications();
sendCallbackStatusMessage(getString(R.string.status_disabled)); sendCallbackStatusMessage(getString(R.string.status_disabled));
@ -472,11 +462,13 @@ public class TorService extends Service implements TorServiceConstants, TorConst
conn = null; conn = null;
} }
int maxTry = 5;
int currTry = 0;
Shell shell = Shell.startShell(); Shell shell = Shell.startShell();
Toolbox tb = new Toolbox(shell);
/*
*
int maxTry = 5;
int currTry = 0;
while ((procId = TorServiceUtils.findProcessId(fileTor.getAbsolutePath())) != -1 && currTry++ < maxTry) while ((procId = TorServiceUtils.findProcessId(fileTor.getAbsolutePath())) != -1 && currTry++ < maxTry)
{ {
@ -489,16 +481,16 @@ public class TorService extends Service implements TorServiceConstants, TorConst
shell.add(killCommand); shell.add(killCommand);
killCommand = new SimpleCommand("kill -9 " + procId); killCommand = new SimpleCommand("kill -9 " + procId);
shell.add(killCommand); shell.add(killCommand);
} }*/
while ((procId = TorServiceUtils.findProcessId(filePrivoxy.getAbsolutePath())) != -1) while ((procId = TorServiceUtils.findProcessId(filePrivoxy.getAbsolutePath())) != -1)
{ {
logNotice("Found Privoxy PID=" + procId + " - killing now..."); logNotice("Found Privoxy PID=" + procId + " - killing now...");
SimpleCommand killCommand = new SimpleCommand("toolbox kill -9 " + procId); SimpleCommand killCommand = new SimpleCommand("toolbox kill " + procId);
shell.add(killCommand); shell.add(killCommand);
killCommand = new SimpleCommand("kill -9 " + procId); killCommand = new SimpleCommand("kill " + procId);
shell.add(killCommand); shell.add(killCommand);
} }
@ -507,9 +499,9 @@ public class TorService extends Service implements TorServiceConstants, TorConst
logNotice("Found ObfsProxy PID=" + procId + " - killing now..."); logNotice("Found ObfsProxy PID=" + procId + " - killing now...");
SimpleCommand killCommand = new SimpleCommand("toolbox kill -9 " + procId); SimpleCommand killCommand = new SimpleCommand("toolbox kill " + procId);
shell.add(killCommand); shell.add(killCommand);
killCommand = new SimpleCommand("kill -9 " + procId); killCommand = new SimpleCommand("kill " + procId);
shell.add(killCommand); shell.add(killCommand);
} }
@ -621,12 +613,6 @@ public class TorService extends Service implements TorServiceConstants, TorConst
boolean portsAvail = checkPortsAvailable(); boolean portsAvail = checkPortsAvailable();
if (!portsAvail)
{
logNotice("Another app is blocking Tor from starting");
return;
}
try try
{ {
initBinaries(); initBinaries();
@ -648,11 +634,8 @@ public class TorService extends Service implements TorServiceConstants, TorConst
currentStatus = STATUS_CONNECTING; currentStatus = STATUS_CONNECTING;
logNotice(getString(R.string.status_starting_up)); logNotice(getString(R.string.status_starting_up));
sendCallbackStatusMessage(getString(R.string.status_starting_up)); sendCallbackStatusMessage(getString(R.string.status_starting_up));
killTorProcess ();
runTorShellCmd(); runTorShellCmd();
runPrivoxyShellCmd(); runPrivoxyShellCmd();
@ -678,7 +661,7 @@ public class TorService extends Service implements TorServiceConstants, TorConst
} }
catch (Exception e) catch (Exception e)
{ {
logException ("Tor socket is not available",e); logException ("Tor socket " + port + " is not available",e);
return false; return false;
} }
} }
@ -763,8 +746,6 @@ public class TorService extends Service implements TorServiceConstants, TorConst
mTransProxy.clearTransparentProxyingAll(this); mTransProxy.clearTransparentProxyingAll(this);
clearNotifications();
return true; return true;
} }
@ -775,9 +756,6 @@ public class TorService extends Service implements TorServiceConstants, TorConst
String torrcPath = new File(appBinHome, TORRC_ASSET_KEY).getAbsolutePath(); String torrcPath = new File(appBinHome, TORRC_ASSET_KEY).getAbsolutePath();
// if (ENABLE_DEBUG_LOG)
// torrcPath = new File(appBinHome, TORRCDIAG_ASSET_KEY).getAbsolutePath();
boolean transProxyTethering = prefs.getBoolean("pref_transparent_tethering", false); boolean transProxyTethering = prefs.getBoolean("pref_transparent_tethering", false);
if (transProxyTethering) if (transProxyTethering)
@ -792,20 +770,15 @@ public class TorService extends Service implements TorServiceConstants, TorConst
sendCallbackStatusMessage(getString(R.string.status_starting_up)); sendCallbackStatusMessage(getString(R.string.status_starting_up));
//start Tor in the background //start Tor in the background
ArrayList<String> alEnv = new ArrayList<String>(); Shell shell = Shell.startShell();
alEnv.add("HOME=" + appBinHome.getAbsolutePath());
Shell shell = Shell.startShell(alEnv,appBinHome.getAbsolutePath());
SimpleCommand cmdTor = new SimpleCommand(fileTor.getAbsolutePath() + " DataDirectory " + appCacheHome.getAbsolutePath() + " -f " + torrcPath + " &"); SimpleCommand cmdTor = new SimpleCommand(fileTor.getAbsolutePath() + " DataDirectory " + appCacheHome.getAbsolutePath() + " -f " + torrcPath + " &");
shell.add(cmdTor); shell.add(cmdTor);
//wait a few seconds
Thread.sleep(torRetryWaitTimeMS); Thread.sleep(torRetryWaitTimeMS);
//now try to connect
procId = initControlConnection ();
shell.close();
//now try to connect
procId = initControlConnection (3);
if (procId == -1) if (procId == -1)
{ {
@ -877,64 +850,70 @@ public class TorService extends Service implements TorServiceConstants, TorConst
return null; return null;
}*/ }*/
private int initControlConnection () throws Exception, RuntimeException private synchronized int initControlConnection (int maxAttempts) throws Exception, RuntimeException
{ {
int maxAttempts = 5;
int i = 0; int i = 0;
while (conn == null && i++ < maxAttempts) if (conn != null)
{ {
try String torProcId = conn.getInfo("process/pid");
{ return Integer.parseInt(torProcId);
logNotice( "Connecting to control port: " + TOR_CONTROL_PORT);
torConnSocket = new Socket(IP_LOCALHOST, TOR_CONTROL_PORT);
conn = TorControlConnection.getConnection(torConnSocket);
logNotice( "SUCCESS connected to control port");
File fileCookie = new File(appCacheHome, TOR_CONTROL_COOKIE);
if (fileCookie.exists())
{
byte[] cookie = new byte[(int)fileCookie.length()];
DataInputStream fis = new DataInputStream(new FileInputStream(fileCookie));
fis.read(cookie);
fis.close();
conn.authenticate(cookie);
logNotice( "SUCCESS - authenticated to control port");
sendCallbackStatusMessage(getString(R.string.tor_process_starting) + ' ' + getString(R.string.tor_process_complete));
addEventHandler();
String torProcId = conn.getInfo("process/pid");
return Integer.parseInt(torProcId);
}
else
{
logNotice ("Tor authentication cookie does not exist yet; trying again...");
}
}
catch (Exception ce)
{
conn = null;
logNotice( "Error connecting to Tor local control port: " + ce.getLocalizedMessage());
Log.d(TAG,"Attempt: Error connecting to control port: " + ce.getLocalizedMessage(),ce);
}
sendCallbackStatusMessage(getString(R.string.tor_process_waiting));
Thread.sleep(3000);
} }
else
{
while (conn == null && i++ < maxAttempts)
{
try
{
logNotice( "Connecting to control port: " + TOR_CONTROL_PORT);
torConnSocket = new Socket(IP_LOCALHOST, TOR_CONTROL_PORT);
conn = TorControlConnection.getConnection(torConnSocket);
logNotice( "SUCCESS connected to control port");
File fileCookie = new File(appCacheHome, TOR_CONTROL_COOKIE);
if (fileCookie.exists())
{
byte[] cookie = new byte[(int)fileCookie.length()];
DataInputStream fis = new DataInputStream(new FileInputStream(fileCookie));
fis.read(cookie);
fis.close();
conn.authenticate(cookie);
logNotice( "SUCCESS - authenticated to control port");
sendCallbackStatusMessage(getString(R.string.tor_process_starting) + ' ' + getString(R.string.tor_process_complete));
addEventHandler();
String torProcId = conn.getInfo("process/pid");
return Integer.parseInt(torProcId);
}
else
{
logNotice ("Tor authentication cookie does not exist yet; trying again...");
}
}
catch (Exception ce)
{
conn = null;
logNotice( "Error connecting to Tor local control port: " + ce.getLocalizedMessage());
Log.d(TAG,"Attempt: Error connecting to control port: " + ce.getLocalizedMessage(),ce);
}
sendCallbackStatusMessage(getString(R.string.tor_process_waiting));
Thread.sleep(3000);
}
}
return -1; return -1;

View File

@ -77,7 +77,7 @@ public interface TorServiceConstants {
public static final int DISABLE_TOR_MSG = 3; public static final int DISABLE_TOR_MSG = 3;
public static final int LOG_MSG = 4; public static final int LOG_MSG = 4;
public static final String BINARY_TOR_VERSION = "0.2.4.21-openssl1.0.1g-if7"; public static final String BINARY_TOR_VERSION = "0.2.4.21-openssl1.0.1g-if8";
public static final String BINARY_PRIVOXY_VERSION = "3.0.12"; public static final String BINARY_PRIVOXY_VERSION = "3.0.12";
public static final String PREF_BINARY_TOR_VERSION_INSTALLED = "BINARY_TOR_VERSION_INSTALLED"; public static final String PREF_BINARY_TOR_VERSION_INSTALLED = "BINARY_TOR_VERSION_INSTALLED";
public static final String PREF_BINARY_PRIVOXY_VERSION_INSTALLED = "BINARY_PRIVOXY_VERSION_INSTALLED"; public static final String PREF_BINARY_PRIVOXY_VERSION_INSTALLED = "BINARY_PRIVOXY_VERSION_INSTALLED";