fixes for Tor processs tracking, control port, and start/stop
This commit is contained in:
		
							parent
							
								
									8481e6199f
								
							
						
					
					
						commit
						e3385ab137
					
				|  | @ -411,7 +411,7 @@ public class TorService extends Service implements TorServiceConstants, TorConst | ||||||
|    	 |    	 | ||||||
|     	try |     	try | ||||||
|     	{	 |     	{	 | ||||||
|     		killTorProcess (); |     		shutdownTorProcess (); | ||||||
|     		 |     		 | ||||||
|     		//stop the foreground priority and make sure to remove the persistant notification |     		//stop the foreground priority and make sure to remove the persistant notification | ||||||
|     		stopForeground(true); |     		stopForeground(true); | ||||||
|  | @ -504,11 +504,9 @@ public class TorService extends Service implements TorServiceConstants, TorConst | ||||||
| 	} | 	} | ||||||
| 	 | 	 | ||||||
| 	 | 	 | ||||||
|     private void killTorProcess () throws Exception |     private void shutdownTorProcess () throws Exception | ||||||
|     { |     { | ||||||
| 
 | 
 | ||||||
| 		//stopTorMinder(); |  | ||||||
| 		    	 |  | ||||||
|     	if (conn != null) |     	if (conn != null) | ||||||
| 		{ | 		{ | ||||||
| 
 | 
 | ||||||
|  | @ -519,9 +517,6 @@ public class TorService extends Service implements TorServiceConstants, TorConst | ||||||
| 				logNotice("sending HALT signal to Tor process"); | 				logNotice("sending HALT signal to Tor process"); | ||||||
| 				conn.shutdownTor("HALT"); | 				conn.shutdownTor("HALT"); | ||||||
| 				 | 				 | ||||||
| 				//logNotice("closing tor socket"); |  | ||||||
| 			//	torConnSocket.close(); |  | ||||||
| 				 |  | ||||||
| 			} catch (Exception e) { | 			} catch (Exception e) { | ||||||
| 				Log.d(TAG,"error shutting down Tor via connection",e); | 				Log.d(TAG,"error shutting down Tor via connection",e); | ||||||
| 			} | 			} | ||||||
|  | @ -852,42 +847,36 @@ public class TorService extends Service implements TorServiceConstants, TorConst | ||||||
|      	return true; |      	return true; | ||||||
|  	} |  	} | ||||||
|      |      | ||||||
|  |     Shell mShellTor; | ||||||
|  |      | ||||||
|     private void runTorShellCmd() throws Exception |     private void runTorShellCmd() throws Exception | ||||||
|     { |     { | ||||||
|     	 |     	 | ||||||
| 		SharedPreferences prefs =TorServiceUtils.getSharedPrefs(getApplicationContext()); |  | ||||||
| 
 |  | ||||||
| 		String torrcPath = new File(appBinHome, TORRC_ASSET_KEY).getCanonicalPath(); | 		String torrcPath = new File(appBinHome, TORRC_ASSET_KEY).getCanonicalPath(); | ||||||
| 
 | 
 | ||||||
| 		int torRetryWaitTimeMS = 1000; |  | ||||||
| 		 |  | ||||||
| 		sendCallbackStatusMessage(getString(R.string.status_starting_up)); | 		sendCallbackStatusMessage(getString(R.string.status_starting_up)); | ||||||
| 
 | 
 | ||||||
|  | 		if (mShellTor != null) | ||||||
|  | 			mShellTor.close(); | ||||||
|  | 		 | ||||||
| 		//start Tor in the background | 		//start Tor in the background | ||||||
| 		Shell shell = Shell.startShell(); | 		mShellTor = Shell.startShell(); | ||||||
| 		 | 		 | ||||||
| 		 | 		SimpleCommand shellTorCommand = new SimpleCommand(fileTor.getCanonicalPath()  | ||||||
| 		SimpleCommand cmdTor = new SimpleCommand(fileTor.getCanonicalPath()  |  | ||||||
| 				+ " DataDirectory " + appCacheHome.getCanonicalPath()  | 				+ " DataDirectory " + appCacheHome.getCanonicalPath()  | ||||||
| 				+ " --defaults-torrc " + torrcPath | 				+ " --defaults-torrc " + torrcPath | ||||||
| 				+ " -f " + torrcPath + ".custom" | 				+ " -f " + torrcPath + ".custom"); | ||||||
| 				+ " &"); |  | ||||||
| 		 | 		 | ||||||
| 		shell.add(cmdTor); | 		mShellTor.add(shellTorCommand); | ||||||
| 		 |  | ||||||
| 		Thread.sleep(torRetryWaitTimeMS); |  | ||||||
| 		 | 		 | ||||||
| 		//now try to connect | 		//now try to connect | ||||||
| 		mLastProcessId = initControlConnection (3); | 		mLastProcessId = initControlConnection (100); | ||||||
| 
 | 
 | ||||||
| 		if (mLastProcessId == -1) | 		if (mLastProcessId == -1) | ||||||
| 		{ | 		{ | ||||||
| 			logNotice(getString(R.string.couldn_t_start_tor_process_) + "; exit=" + cmdTor.getExitCode() + ": " + cmdTor.getOutput()); | 			logNotice(getString(R.string.couldn_t_start_tor_process_) + "; exit=" + shellTorCommand.getExitCode() + ": " + shellTorCommand.getOutput()); | ||||||
| 			sendCallbackStatusMessage(getString(R.string.couldn_t_start_tor_process_)); | 			sendCallbackStatusMessage(getString(R.string.couldn_t_start_tor_process_)); | ||||||
| 		 | 		 | ||||||
| 			logNotice("Tor exit code: " + cmdTor.getExitCode()); |  | ||||||
| 			 |  | ||||||
| 			 |  | ||||||
| 			throw new Exception ("Unable to start Tor"); | 			throw new Exception ("Unable to start Tor"); | ||||||
| 		} | 		} | ||||||
| 		else | 		else | ||||||
|  | @ -897,11 +886,9 @@ public class TorService extends Service implements TorServiceConstants, TorConst | ||||||
| 			 | 			 | ||||||
| 			processSettingsImpl(); | 			processSettingsImpl(); | ||||||
| 			 | 			 | ||||||
| 		//	startTorMinder (); |  | ||||||
| 
 | 
 | ||||||
| 	    } | 	    } | ||||||
| 		 | 		 | ||||||
| 		shell.close(); |  | ||||||
| 		 | 		 | ||||||
|     } |     } | ||||||
|      |      | ||||||
|  | @ -981,13 +968,14 @@ public class TorService extends Service implements TorServiceConstants, TorConst | ||||||
| 		return null; | 		return null; | ||||||
| 	}*/ | 	}*/ | ||||||
| 	 | 	 | ||||||
| 	private synchronized int initControlConnection (int maxAttempts) throws Exception, RuntimeException | 	private synchronized int initControlConnection (int maxTries) throws Exception, RuntimeException | ||||||
| 	{ | 	{ | ||||||
| 			int i = 0; | 			int i = 0; | ||||||
|  | 			int controlPort = getControlPort(); | ||||||
|  | 			File fileCookie = new File(appCacheHome, TOR_CONTROL_COOKIE); | ||||||
| 	         | 	         | ||||||
| 			if (conn != null) | 			if (conn != null) | ||||||
| 			{ | 			{ | ||||||
| 				File fileCookie = new File(appCacheHome, TOR_CONTROL_COOKIE); |  | ||||||
| 				 | 				 | ||||||
| 		        if (fileCookie.exists()) | 		        if (fileCookie.exists()) | ||||||
| 		        { | 		        { | ||||||
|  | @ -997,91 +985,87 @@ public class TorService extends Service implements TorServiceConstants, TorConst | ||||||
| 			        fis.close(); | 			        fis.close(); | ||||||
| 			        conn.authenticate(cookie); | 			        conn.authenticate(cookie); | ||||||
| 			     | 			     | ||||||
| 		        } | 					String torProcId = conn.getInfo("process/pid"); | ||||||
| 		         | 					return Integer.parseInt(torProcId); | ||||||
| 				 String torProcId = conn.getInfo("process/pid"); |  | ||||||
| 				  return Integer.parseInt(torProcId); |  | ||||||
| 			} |  | ||||||
| 			else |  | ||||||
| 			{ |  | ||||||
| 				while (conn == null && i++ < maxAttempts) |  | ||||||
| 				{ |  | ||||||
| 					try |  | ||||||
| 					{ |  | ||||||
| 						 |  | ||||||
| 						int controlPort = getControlPort(); |  | ||||||
| 						 |  | ||||||
| 						if (controlPort == -1 && i == maxAttempts) |  | ||||||
| 							controlPort = DEFAULT_CONTROL_PORT; |  | ||||||
| 						 |  | ||||||
| 						if (controlPort != -1) |  | ||||||
| 						{ |  | ||||||
| 							logNotice( "Connecting to control port: " + controlPort); |  | ||||||
| 							 |  | ||||||
| 							torConnSocket = new Socket(IP_LOCALHOST, controlPort); |  | ||||||
| 							torConnSocket.setSoTimeout(CONTROL_SOCKET_TIMEOUT); |  | ||||||
| 							 |  | ||||||
| 					        conn = TorControlConnection.getConnection(torConnSocket); |  | ||||||
| 					         |  | ||||||
| 					         |  | ||||||
| 							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"); |  | ||||||
| 						         |  | ||||||
| 								sendCallbackStatusMessage(getString(R.string.tor_process_starting) + ' ' + getString(R.string.tor_process_complete)); |  | ||||||
| 			 |  | ||||||
| 						        addEventHandler(); |  | ||||||
| 						     |  | ||||||
| 						        String torProcId = conn.getInfo("process/pid"); |  | ||||||
| 						         |  | ||||||
| 						        if (ENABLE_DEBUG_LOG) |  | ||||||
| 						        { |  | ||||||
| 						        	//File fileLog = new File(getFilesDir(),"orbot-control-log.txt"); |  | ||||||
| 						        	//PrintWriter pr = new PrintWriter(new FileWriter(fileLog,true)); |  | ||||||
| 						        	//conn.setDebugging(pr); |  | ||||||
| 						        	 |  | ||||||
| 						        	File fileLog2 = new File(getFilesDir(),"orbot-tor-log.txt"); |  | ||||||
| 						        	conn.setConf("Log", "debug file " + fileLog2.getCanonicalPath()); |  | ||||||
| 						        	 |  | ||||||
| 						        } |  | ||||||
| 						         |  | ||||||
| 						        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(5000); } |  | ||||||
| 					catch (Exception e){} |  | ||||||
| 				 | 				 | ||||||
| 				}	 | 				}	 | ||||||
| 			} | 			} | ||||||
| 			 | 			 | ||||||
|  | 			int attempt = 0; | ||||||
|  | 			 | ||||||
|  | 			while (conn == null && attempt++ < maxTries) | ||||||
|  | 			{ | ||||||
|  | 				try | ||||||
|  | 				{ | ||||||
|  | 					 | ||||||
|  | 					controlPort = getControlPort(); | ||||||
|  | 					 | ||||||
|  | 					if (controlPort != -1) | ||||||
|  | 					{ | ||||||
|  | 						logNotice( "Connecting to control port: " + controlPort); | ||||||
|  | 						 | ||||||
|  | 						torConnSocket = new Socket(IP_LOCALHOST, controlPort); | ||||||
|  | 						torConnSocket.setSoTimeout(CONTROL_SOCKET_TIMEOUT); | ||||||
|  | 						 | ||||||
|  | 				        conn = TorControlConnection.getConnection(torConnSocket); | ||||||
|  | 				         | ||||||
|  | 						logNotice( "SUCCESS connected to Tor control port"); | ||||||
|  | 				         | ||||||
|  | 				        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"); | ||||||
|  | 					         | ||||||
|  | 					        if (ENABLE_DEBUG_LOG) | ||||||
|  | 					        { | ||||||
|  | 					        	//File fileLog = new File(getFilesDir(),"orbot-control-log.txt"); | ||||||
|  | 					        	//PrintWriter pr = new PrintWriter(new FileWriter(fileLog,true)); | ||||||
|  | 					        	//conn.setDebugging(pr); | ||||||
|  | 					        	 | ||||||
|  | 					        	File fileLog2 = new File(getFilesDir(),"orbot-tor-log.txt"); | ||||||
|  | 					        	conn.setConf("Log", "debug file " + fileLog2.getCanonicalPath()); | ||||||
|  | 					        	 | ||||||
|  | 					        } | ||||||
|  | 					         | ||||||
|  | 					        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(5000); } | ||||||
|  | 				catch (Exception e){} | ||||||
|  | 				 | ||||||
|  | 			} | ||||||
|  | 		 | ||||||
| 			return -1; | 			return -1; | ||||||
| 
 | 
 | ||||||
| 	} | 	} | ||||||
|  | @ -1098,8 +1082,6 @@ public class TorService extends Service implements TorServiceConstants, TorConst | ||||||
| 				BufferedReader bufferedReader = new BufferedReader(new FileReader(fileControlPort)); | 				BufferedReader bufferedReader = new BufferedReader(new FileReader(fileControlPort)); | ||||||
| 				String line = bufferedReader.readLine(); | 				String line = bufferedReader.readLine(); | ||||||
| 				 | 				 | ||||||
| 				//PORT=127.0.0.1:45051 |  | ||||||
| 				 |  | ||||||
| 				if (line != null) | 				if (line != null) | ||||||
| 				{ | 				{ | ||||||
| 					String[] lineParts = line.split(":"); | 					String[] lineParts = line.split(":"); | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue