[tor-commits] [orbot/master] use canonical paths to ensure shell commands are correct
n8fr8 at torproject.org
n8fr8 at torproject.org
Sat Jun 14 10:01:22 UTC 2014
commit 8a59cfb6d210aa460ce7d5f71bd569f9407ef3ea
Author: Nathan Freitas <nathan at freitas.net>
Date: Fri Jun 13 13:00:42 2014 -0400
use canonical paths to ensure shell commands are correct
also cleanup torrc updating
---
src/org/torproject/android/service/TorService.java | 145 +++++++++++++-------
1 file changed, 99 insertions(+), 46 deletions(-)
diff --git a/src/org/torproject/android/service/TorService.java b/src/org/torproject/android/service/TorService.java
index 3de7fb3..63730d6 100644
--- a/src/org/torproject/android/service/TorService.java
+++ b/src/org/torproject/android/service/TorService.java
@@ -25,6 +25,7 @@ import java.util.List;
import java.util.StringTokenizer;
import java.util.Timer;
import java.util.TimerTask;
+import java.util.concurrent.TimeoutException;
import net.freehaven.tor.control.ConfigEntry;
import net.freehaven.tor.control.EventHandler;
@@ -72,7 +73,6 @@ 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;
@@ -96,6 +96,7 @@ public class TorService extends Service implements TorServiceConstants, TorConst
private File fileXtables;
private File fileTorRc;
+ private File fileControlPort;
private TorTransProxy mTransProxy;
@@ -361,11 +362,14 @@ public class TorService extends Service implements TorServiceConstants, TorConst
if (currentStatus == STATUS_ON)
{
- this.showToolbarNotification("Tor service stopped unexpectedly", ERROR_NOTIFY_ID, R.drawable.ic_stat_notifyerr, false);
+ //make sure we stop Tor processes
+ stopTor();
+
+ showToolbarNotification("Tor service stopped unexpectedly", ERROR_NOTIFY_ID, R.drawable.ic_stat_notifyerr, false);
+
}
- //Log.d(TAG,"onDestroy called");
- // Unregister all callbacks.
+ // Unregister all callbacks.
mCallbacks.kill();
unregisterReceiver(mNetworkStateReceiver);
@@ -505,7 +509,7 @@ public class TorService extends Service implements TorServiceConstants, TorConst
int procId = -1;
Shell shell = Shell.startShell();
- while ((procId = TorServiceUtils.findProcessId(fileProcBin.getAbsolutePath())) != -1)
+ while ((procId = TorServiceUtils.findProcessId(fileProcBin.getCanonicalPath())) != -1)
{
logNotice("Found fileObfsclient PID=" + procId + " - killing now...");
@@ -556,13 +560,6 @@ public class TorService extends Service implements TorServiceConstants, TorConst
TorResourceInstaller installer = new TorResourceInstaller(this, appBinHome);
- String extraLines = prefs.getString("pref_custom_torrc", null);
-
- if (extraLines != null)
- {
- boolean success = installer.installTorrc(extraLines);
- }
-
if (version == null || (!version.equals(BINARY_TOR_VERSION)) || (!fileTor.exists()))
{
logNotice("upgrading binaries to latest version: " + BINARY_TOR_VERSION);
@@ -573,9 +570,37 @@ public class TorService extends Service implements TorServiceConstants, TorConst
prefs.edit().putString(PREF_BINARY_TOR_VERSION_INSTALLED,BINARY_TOR_VERSION).commit();
}
-
+ updateTorConfigFile ();
+
+
}
+ private boolean updateTorConfigFile () throws FileNotFoundException, IOException, TimeoutException
+ {
+ SharedPreferences prefs = TorServiceUtils.getSharedPrefs(getApplicationContext());
+
+ TorResourceInstaller installer = new TorResourceInstaller(this, appBinHome);
+
+ StringBuffer extraLines = new StringBuffer();
+
+ String TORRC_CONTROLPORT_FILE_KEY = "ControlPortWriteToFile";
+ fileControlPort = new File(appBinHome,"control.txt");
+ extraLines.append(TORRC_CONTROLPORT_FILE_KEY).append(' ').append(fileControlPort.getCanonicalPath());
+ extraLines.append('\n');
+ extraLines.append(prefs.getString("pref_custom_torrc", ""));
+
+ logNotice("updating torrc configuration...");
+
+ boolean success = installer.updateTorConfig(fileTorRc, extraLines.toString());
+
+ if (success)
+ {
+ logNotice ("success.");
+ }
+
+ return success;
+ }
+
private boolean enableBinExec (File fileBin) throws Exception
{
@@ -583,12 +608,12 @@ public class TorService extends Service implements TorServiceConstants, TorConst
if (!fileBin.canExecute())
{
- logNotice("(re)Setting permission on binary: " + fileBin.getAbsolutePath());
- Shell shell = Shell.startShell(new ArrayList<String>(), appBinHome.getAbsolutePath());
+ logNotice("(re)Setting permission on binary: " + fileBin.getCanonicalPath());
+ Shell shell = Shell.startShell(new ArrayList<String>(), appBinHome.getCanonicalPath());
- shell.add(new SimpleCommand("chmod " + CHMOD_EXE_VALUE + ' ' + fileBin.getAbsolutePath())).waitForFinish();
+ shell.add(new SimpleCommand("chmod " + CHMOD_EXE_VALUE + ' ' + fileBin.getCanonicalPath())).waitForFinish();
- File fileTest = new File(fileBin.getAbsolutePath());
+ File fileTest = new File(fileBin.getCanonicalPath());
logNotice(fileTest.getName() + ": POST: Is binary exec? " + fileTest.canExecute());
shell.close();
@@ -748,13 +773,13 @@ public class TorService extends Service implements TorServiceConstants, TorConst
SharedPreferences prefs =TorServiceUtils.getSharedPrefs(getApplicationContext());
- String torrcPath = new File(appBinHome, TORRC_ASSET_KEY).getAbsolutePath();
+ String torrcPath = new File(appBinHome, TORRC_ASSET_KEY).getCanonicalPath();
boolean transProxyTethering = prefs.getBoolean("pref_transparent_tethering", false);
if (transProxyTethering)
{
- torrcPath = new File(appBinHome, TORRC_TETHER_KEY).getAbsolutePath();
+ torrcPath = new File(appBinHome, TORRC_TETHER_KEY).getCanonicalPath();
}
int torRetryWaitTimeMS = 1000;
@@ -765,7 +790,7 @@ public class TorService extends Service implements TorServiceConstants, TorConst
Shell shell = Shell.startShell();
- SimpleCommand cmdTor = new SimpleCommand(fileTor.getAbsolutePath() + " DataDirectory " + appCacheHome.getAbsolutePath() + " -f " + torrcPath + " &");
+ SimpleCommand cmdTor = new SimpleCommand(fileTor.getCanonicalPath() + " DataDirectory " + appCacheHome.getCanonicalPath() + " -f " + torrcPath + " &");
shell.add(cmdTor);
@@ -804,7 +829,7 @@ public class TorService extends Service implements TorServiceConstants, TorConst
logNotice( "Starting polipo process");
- int polipoProcId = TorServiceUtils.findProcessId(filePolipo.getAbsolutePath());
+ int polipoProcId = TorServiceUtils.findProcessId(filePolipo.getCanonicalPath());
StringBuilder log = null;
@@ -816,15 +841,15 @@ public class TorService extends Service implements TorServiceConstants, TorConst
{
log = new StringBuilder();
- String polipoConfigPath = new File(appBinHome, POLIPOCONFIG_ASSET_KEY).getAbsolutePath();
- SimpleCommand cmdPolipo = new SimpleCommand(filePolipo.getAbsolutePath() + " -c " + polipoConfigPath + " &");
+ String polipoConfigPath = new File(appBinHome, POLIPOCONFIG_ASSET_KEY).getCanonicalPath();
+ SimpleCommand cmdPolipo = new SimpleCommand(filePolipo.getCanonicalPath() + " -c " + polipoConfigPath + " &");
shell.add(cmdPolipo);
//wait one second to make sure it has started up
Thread.sleep(1000);
- while ((polipoProcId = TorServiceUtils.findProcessId(filePolipo.getAbsolutePath())) == -1 && attempts < MAX_START_TRIES)
+ while ((polipoProcId = TorServiceUtils.findProcessId(filePolipo.getCanonicalPath())) == -1 && attempts < MAX_START_TRIES)
{
logNotice("Couldn't find Polipo process... retrying...\n" + log);
Thread.sleep(3000);
@@ -953,31 +978,36 @@ public class TorService extends Service implements TorServiceConstants, TorConst
private int getControlPort ()
{
- File fileControl = new File(appBinHome,"control.txt");
int result = -1;
try
{
-
- logNotice("Reading control port config file: " + fileControl.getAbsolutePath());
- BufferedReader bufferedReader = new BufferedReader(new FileReader(fileControl));
- String line = bufferedReader.readLine();
-
- //PORT=127.0.0.1:45051
-
- if (line != null)
+ if (fileControlPort.exists())
+ {
+ logNotice("Reading control port config file: " + fileControlPort.getCanonicalPath());
+ BufferedReader bufferedReader = new BufferedReader(new FileReader(fileControlPort));
+ String line = bufferedReader.readLine();
+
+ //PORT=127.0.0.1:45051
+
+ if (line != null)
+ {
+ String[] lineParts = line.split(":");
+ result = Integer.parseInt(lineParts[1]);
+ }
+
+ bufferedReader.close();
+ }
+ else
{
- String[] lineParts = line.split(":");
- result = Integer.parseInt(lineParts[1]);
+ logNotice("Control Port config file does not yet exist (waiting for tor): " + fileControlPort.getCanonicalPath());
}
- bufferedReader.close();
-
}
catch (FileNotFoundException e)
{
- logNotice("unable to get control port; no file at: " + fileControl.getAbsolutePath());
+ logNotice("unable to get control port; file not found");
}
catch (IOException e)
{
@@ -1071,7 +1101,30 @@ 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 mSocksPort;
+
+ int socksPort = -1;
+
+ SharedPreferences prefs = TorServiceUtils.getSharedPrefs(getApplicationContext());
+
+ String socksConfig = prefs.getString(TorConstants.PREF_SOCKS, TorServiceConstants.PORT_SOCKS_DEFAULT);
+
+ try
+ {
+
+ if (!socksConfig.equalsIgnoreCase("auto"))
+ if (socksConfig.contains(":"))
+ socksPort = Integer.parseInt(socksConfig.split(":")[1]);
+ else
+ socksPort = Integer.parseInt(socksConfig);
+
+ }
+ catch (Exception e)
+ {
+ logException ("unable to parse socks config: " + socksConfig,e);
+
+ }
+
+ return socksPort;
}
@@ -1817,8 +1870,8 @@ public class TorService extends Service implements TorServiceConstants, TorConst
}
- mBinder.updateConfiguration("GeoIPFile", fileGeoIP.getAbsolutePath(), false);
- mBinder.updateConfiguration("GeoIPv6File", fileGeoIP6.getAbsolutePath(), false);
+ mBinder.updateConfiguration("GeoIPFile", fileGeoIP.getCanonicalPath(), false);
+ mBinder.updateConfiguration("GeoIPv6File", fileGeoIP6.getCanonicalPath(), false);
}
catch (Exception e)
@@ -1876,7 +1929,7 @@ public class TorService extends Service implements TorServiceConstants, TorConst
if (obfsBridges)
{
- String bridgeConfig = "obfs2,obfs3,scramblesuit exec " + fileObfsclient.getAbsolutePath();
+ String bridgeConfig = "obfs2,obfs3,scramblesuit exec " + fileObfsclient.getCanonicalPath();
logMessage ("Using OBFUSCATED bridges: " + bridgeConfig);
@@ -1979,7 +2032,7 @@ public class TorService extends Service implements TorServiceConstants, TorConst
hsPort = Integer.parseInt(hsPortConfig.split(" ")[0]);
- String hsDirPath = new File(appCacheHome,"hs" + hsPort).getAbsolutePath();
+ String hsDirPath = new File(appCacheHome,"hs" + hsPort).getCanonicalPath();
logMessage("Adding hidden service on port: " + hsPortConfig);
@@ -2009,7 +2062,7 @@ public class TorService extends Service implements TorServiceConstants, TorConst
}
private void enableSocks (String socks, boolean safeSocks) throws RemoteException
- {
+ {
mBinder.updateConfiguration("SOCKSPort", socks, false);
mBinder.updateConfiguration("SafeSocks", safeSocks ? "1" : "0", false);
mBinder.updateConfiguration("TestSocks", "1", false);
@@ -2034,7 +2087,7 @@ public class TorService extends Service implements TorServiceConstants, TorConst
bw.println("nameserver 8.8.4.4");
bw.close();
- return file.getAbsolutePath();
+ return file.getCanonicalPath();
}
@SuppressLint("NewApi")
@@ -2140,7 +2193,7 @@ public class TorService extends Service implements TorServiceConstants, TorConst
{
try {
- int foundPrcId = TorServiceUtils.findProcessId(fileTor.getAbsolutePath());
+ int foundPrcId = TorServiceUtils.findProcessId(fileTor.getCanonicalPath());
if (foundPrcId != -1)
{
More information about the tor-commits
mailing list