commit 9c4c3496f1c25b041980426d0e7c40e5c02df50a Author: Nathan Freitas <[email protected]> Date: Wed Sep 3 22:45:31 2014 -0400
fix for reconnecting to exiting Tor process after service restart
---
src/org/torproject/android/Orbot.java | 13 ++
.../torproject/android/service/ITorService.aidl | 6 +
src/org/torproject/android/service/TorService.java | 238 ++++++++++++++------
3 files changed, 184 insertions(+), 73 deletions(-)
diff --git a/src/org/torproject/android/Orbot.java
b/src/org/torproject/android/Orbot.java
index 209896d..5300dea 100644
--- a/src/org/torproject/android/Orbot.java
+++ b/src/org/torproject/android/Orbot.java
@@ -590,6 +590,14 @@ public class Orbot extends ActionBarActivity implements
TorConstants, OnLongClic
{
try {
startTor();
+
+
+ Intent nResult = new Intent();
+
+ //nResult.putExtra("socks", ); //TODO
respond with socks, transport, dns, etc
+
+ setResult(RESULT_OK,nResult);
+
} catch (RemoteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
@@ -631,6 +639,8 @@ public class Orbot extends ActionBarActivity implements
TorConstants, OnLongClic
pEdit.putBoolean(TorConstants.PREF_BRIDGES_ENABLED,true);
pEdit.commit();
+
+ setResult(RESULT_OK);
}
}
}
@@ -821,6 +831,9 @@ public class Orbot extends ActionBarActivity implements
TorConstants, OnLongClic
torStatus = mService.getStatus();
+ if (torStatus == 0) //make sure we don't have a tor
process already running
+ mService.checkAndInit();
+
handleIntents();
} catch (RemoteException e) {
// TODO Auto-generated catch block
diff --git a/src/org/torproject/android/service/ITorService.aidl
b/src/org/torproject/android/service/ITorService.aidl
index 07b08a0..e1f2812 100644
--- a/src/org/torproject/android/service/ITorService.aidl
+++ b/src/org/torproject/android/service/ITorService.aidl
@@ -12,6 +12,12 @@ interface ITorService {
int getStatus();
/**
+ * check for exiting Tor process
+ **/
+ boolean checkAndInit ();
+
+
+ /**
* The profile value is the start/stop state for Tor
**/
void setProfile(int profile);
diff --git a/src/org/torproject/android/service/TorService.java
b/src/org/torproject/android/service/TorService.java
index 9d91883..1dd39f8 100644
--- a/src/org/torproject/android/service/TorService.java
+++ b/src/org/torproject/android/service/TorService.java
@@ -177,7 +177,7 @@ public class TorService extends Service implements
TorServiceConstants, TorConst
try
{
- mLastProcessId = initControlConnection(3);
+ mLastProcessId = initControlConnection(3,true);
if (mLastProcessId != -1 && conn != null)
{
@@ -570,7 +570,11 @@ public class TorService extends Service implements
TorServiceConstants, TorConst
@Override
public void onCreate() {
super.onCreate();
-
+ initialize();
+ }
+
+ private void initialize()
+ {
try
{
initBinariesAndDirectories();
@@ -656,11 +660,7 @@ public class TorService extends Service implements
TorServiceConstants, TorConst
String TORRC_CONTROLPORT_FILE_KEY = "ControlPortWriteToFile";
fileControlPort = new File(appBinHome,"control.txt");
extraLines.append(TORRC_CONTROLPORT_FILE_KEY).append('
').append(fileControlPort.getCanonicalPath()).append('\n');
-
- String transPort = prefs.getString("pref_transport",
TorServiceConstants.TOR_TRANSPROXY_PORT_DEFAULT+"");
- String dnsPort = prefs.getString("pref_dnsport",
TorServiceConstants.TOR_DNS_PORT_DEFAULT+"");
-
if (mTransProxyTethering)
{
extraLines.append("TransListenAddress
0.0.0.0").append('\n');
@@ -676,8 +676,8 @@ public class TorService extends Service implements
TorServiceConstants, TorConst
extraLines.append("TestSocks 0").append('\n');
extraLines.append("WarnUnsafeSocks 1").append('\n');
- extraLines.append("TransPort ").append(transPort).append('\n');
- extraLines.append("DNSPort ").append(dnsPort).append('\n');
+ extraLines.append("TransPort ").append("auto").append('\n');
+ extraLines.append("DNSPort ").append("auto").append('\n');
extraLines.append("VirtualAddrNetwork 10.192.0.0/10").append('\n');
extraLines.append("AutomapHostsOnResolve 1").append('\n');
@@ -741,7 +741,7 @@ public class TorService extends Service implements
TorServiceConstants, TorConst
}
- public void initTor () throws Exception
+ public void startTor () throws Exception
{
currentStatus = STATUS_CONNECTING;
@@ -965,9 +965,8 @@ public class TorService extends Service implements
TorServiceConstants, TorConst
return false;
}
-
//now try to connect
- mLastProcessId = initControlConnection (100);
+ mLastProcessId = initControlConnection (100,false);
if (mLastProcessId == -1)
{
@@ -1052,7 +1051,7 @@ public class TorService extends Service implements
TorServiceConstants, TorConst
}
- private int initControlConnection (int maxTries) throws Exception,
RuntimeException
+ private int initControlConnection (int maxTries, boolean isReconnect)
throws Exception, RuntimeException
{
int i = 0;
int controlPort = -1;
@@ -1076,46 +1075,83 @@ public class TorService extends Service implements
TorServiceConstants, TorConst
conn = new
TorControlConnection(torConnSocket);
conn.launchThread(true);//is daemon
- logNotice( "SUCCESS connected
to Tor control port.");
+ break;
+ }
+
+ }
+ catch (Exception ce)
+ {
+ conn = null;
+ logException( "Error connecting to Tor
local control port: " + ce.getMessage(),ce);
+
+ }
+
+
+ try {
+ logNotice("waiting...");
+ Thread.sleep(1000); }
+ catch (Exception e){}
+
+
+
+ }
+
+ if (conn != null)
+ {
+ logNotice( "SUCCESS connected to Tor
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.");
- File fileCookie = new
File(appCacheHome, TOR_CONTROL_COOKIE);
+
sendCallbackStatusMessage(getString(R.string.tor_process_starting) + ' ' +
getString(R.string.tor_process_complete));
+
+ addEventHandler();
+
+ String torProcId =
conn.getInfo("process/pid");
- if (fileCookie.exists())
+ //remove this for now until we can make
a clean way to share logs from internal storage
+ /**
+ if (ENABLE_DEBUG_LOG)
{
- 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");
-
- //remove this for now until we
can make a clean way to share logs from internal storage
- /**
- if (ENABLE_DEBUG_LOG)
- {
- File fileLog2 = new
File(getFilesDir(),"orbot-tor-log.txt");
-
fileLog2.setReadable(true);
- conn.setConf("Log",
"debug file " + fileLog2.getCanonicalPath());
- }*/
-
- currentStatus =
STATUS_CONNECTING;
-
- String confSocks =
conn.getInfo("net/listeners/socks");
- StringTokenizer st =
new StringTokenizer(confSocks," ");
-
- confSocks =
st.nextToken().split(":")[1];
- confSocks =
confSocks.substring(0,confSocks.length()-1);
- mPortSOCKS =
Integer.parseInt(confSocks);
-
+ File fileLog2 = new
File(getFilesDir(),"orbot-tor-log.txt");
+ fileLog2.setReadable(true);
+ conn.setConf("Log", "debug file
" + fileLog2.getCanonicalPath());
+ }*/
+
+ currentStatus = STATUS_CONNECTING;
+
+ String confSocks =
conn.getInfo("net/listeners/socks");
+ StringTokenizer st = new
StringTokenizer(confSocks," ");
+
+ confSocks =
st.nextToken().split(":")[1];
+ confSocks =
confSocks.substring(0,confSocks.length()-1);
+ mPortSOCKS =
Integer.parseInt(confSocks);
+
+ if (!isReconnect) //if we are
reconnected then we don't need to reset the ports
+ {
+
SharedPreferences prefs =
TorServiceUtils.getSharedPrefs(getApplicationContext());
+
String socksPortPref =
prefs.getString(TorConstants.PREF_SOCKS,
TorServiceConstants.PORT_SOCKS_DEFAULT);
+ if
(socksPortPref.indexOf(':')!=-1)
+ socksPortPref =
socksPortPref.split(":")[1];
+
+ String transPort =
prefs.getString("pref_transport",
TorServiceConstants.TOR_TRANSPROXY_PORT_DEFAULT+"");
+ if
(transPort.indexOf(':')!=-1)
+ transPort =
transPort.split(":")[1];
+
+ String dnsPort =
prefs.getString("pref_dnsport", TorServiceConstants.TOR_DNS_PORT_DEFAULT+"");
+ if
(dnsPort.indexOf(':')!=-1)
+ dnsPort =
dnsPort.split(":")[1];
try
{
@@ -1126,7 +1162,7 @@ public class TorService extends Service implements
TorServiceConstants, TorConst
ArrayList<String> socksLines = new ArrayList<String>();
socksLines.add("SOCKSPort " + mPortSOCKS);
socksLines.add("SOCKSPort " + socksPortPref);
-
+
conn.setConf(socksLines);
mPortSOCKS =
newSocksPort;
@@ -1136,37 +1172,69 @@ public class TorService extends Service implements
TorServiceConstants, TorConst
}
catch (Exception e)
{
-
//sendCallbackLogMessage("ERROR adding SOCKS on port: " + socksPortPref);
-
sendCallbackLogMessage("Local SOCKS port: " + socksPortPref);
+
sendCallbackLogMessage("Error setting TransProxy port to: " + socksPortPref);
+
}
- return
Integer.parseInt(torProcId);
-
- }
- else
- {
- logNotice ("Tor authentication
cookie does not exist yet");
- conn = null;
-
+ try
+ {
+ int newPort =
Integer.parseInt(transPort);
+ ServerSocket ss
= new ServerSocket(newPort);
+ ss.close();
+
+
ArrayList<String> confLines = new ArrayList<String>();
+
+
confLines.add("TransPort " + transPort);
+
+
conn.setConf(confLines);
+
+
sendCallbackLogMessage("Local TransProxy port: " + transPort);
+
+ }
+ catch (Exception e)
+ {
+
sendCallbackLogMessage("ERROR setting TransProxy port to: " + transPort);
+
+
+
+ }
+
+ try
+ {
+ int newPort =
Integer.parseInt(dnsPort);
+ ServerSocket ss
= new ServerSocket(newPort);
+ ss.close();
+
+
ArrayList<String> confLines = new ArrayList<String>();
+
+
confLines.add("DNSPort " + dnsPort);
+
+
conn.setConf(confLines);
+
+
sendCallbackLogMessage("Local DNSPort port: " + transPort);
+
+ }
+ catch (Exception e)
+ {
+
sendCallbackLogMessage("ERROR setting DNSport to: " + dnsPort);
+
+
+ }
}
- }
+
+ return Integer.parseInt(torProcId);
+ }
+ else
+ {
+ logNotice ("Tor authentication cookie
does not exist yet");
+ conn = null;
+
+ }
}
- catch (Exception ce)
- {
- conn = null;
- logException( "Error connecting to Tor
local control port: " + ce.getMessage(),ce);
-
- }
-
- try {
- logNotice("waiting...");
- Thread.sleep(1000); }
- catch (Exception e){}
- }
-
+
return -1;
}
@@ -1307,7 +1375,7 @@ public class TorService extends Service implements
TorServiceConstants, TorConst
try
{
- initTor();
+ startTor();
}
catch (Exception e)
@@ -1614,6 +1682,26 @@ public class TorService extends Service implements
TorServiceConstants, TorConst
return mBinder;
}
+ public boolean checkAndInitImpl ()
+ {
+ if (fileTor != null)
+ {
+ try {
+ if
(TorServiceUtils.findProcessId(fileTor.getCanonicalPath()) != -1)
+ {
+ initialize();
+ return true;
+ }
+ } catch (IOException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+
+ }
+
+ return false;
+ }
+
/**
* The IRemoteInterface is defined through IDL
*/
@@ -1624,6 +1712,10 @@ public class TorService extends Service implements
TorServiceConstants, TorConst
}
+ public boolean checkAndInit () {
+ return checkAndInitImpl();
+ }
+
public void setProfile (final int profileNew)
{
_______________________________________________
tor-commits mailing list
[email protected]
https://lists.torproject.org/cgi-bin/mailman/listinfo/tor-commits
