[tor-commits] [orbot/master] fix for reconnecting to exiting Tor process after service restart

n8fr8 at torproject.org n8fr8 at torproject.org
Sun Sep 7 13:42:55 UTC 2014


commit 9c4c3496f1c25b041980426d0e7c40e5c02df50a
Author: Nathan Freitas <nathan at freitas.net>
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)
         {
         	





More information about the tor-commits mailing list