commit 7a1c0f322408f9415acd1a4dce0513247c89b40f Author: Nathan Freitas nathan@freitas.net Date: Mon Jul 25 16:12:41 2011 -0400
fixed and cleaned up file path issues with binary installs and execution --- .../android/service/TorBinaryInstaller.java | 151 +++++--------------- src/org/torproject/android/service/TorService.java | 54 ++++---- 2 files changed, 61 insertions(+), 144 deletions(-)
diff --git a/src/org/torproject/android/service/TorBinaryInstaller.java b/src/org/torproject/android/service/TorBinaryInstaller.java index 3c4907d..ba6ab3f 100644 --- a/src/org/torproject/android/service/TorBinaryInstaller.java +++ b/src/org/torproject/android/service/TorBinaryInstaller.java @@ -20,169 +20,88 @@ import android.util.Log; public class TorBinaryInstaller implements TorServiceConstants {
- String installPath; - String apkPath; + File installFolder; Context context; - public TorBinaryInstaller (Context context, String installPath, String apkPath) + public TorBinaryInstaller (Context context, File installFolder) { - this.installPath = installPath; - this.apkPath = apkPath; - this.context = context; - } - - /* - * Start the binary installation if the file doesn't exist or is forced - */ - public void start (boolean force) - { - - boolean torBinaryExists = new File(installPath + TOR_BINARY_ASSET_KEY).exists(); - Log.d(TAG,"Tor binary exists=" + torBinaryExists); - - boolean privoxyBinaryExists = new File(installPath + PRIVOXY_ASSET_KEY).exists(); - Log.d(TAG,"Privoxy binary exists=" + privoxyBinaryExists); - - if (!(torBinaryExists && privoxyBinaryExists) || force) - installFromRaw (); - - + this.installFolder = installFolder; + this.context = context; } // /* * Extract the Tor binary from the APK file using ZIP */ - private void installFromRaw () + public boolean installFromRaw () { + boolean result = false; - InputStream is = context.getResources().openRawResource(R.raw.toraa); - streamToFile(is,installPath + TOR_BINARY_ASSET_KEY, false); + try + { + InputStream is; + + is = context.getResources().openRawResource(R.raw.toraa); + streamToFile(is,installFolder, TOR_BINARY_ASSET_KEY, false); is = context.getResources().openRawResource(R.raw.torab); - streamToFile(is,installPath + TOR_BINARY_ASSET_KEY, true); + streamToFile(is,installFolder, TOR_BINARY_ASSET_KEY, true); is = context.getResources().openRawResource(R.raw.torac); - streamToFile(is,installPath + TOR_BINARY_ASSET_KEY, true); + streamToFile(is,installFolder, TOR_BINARY_ASSET_KEY, true); is = context.getResources().openRawResource(R.raw.torad); - streamToFile(is,installPath + TOR_BINARY_ASSET_KEY, true); + streamToFile(is,installFolder, TOR_BINARY_ASSET_KEY, true); is = context.getResources().openRawResource(R.raw.torrc); - streamToFile(is,installPath + TORRC_ASSET_KEY, false); - + streamToFile(is,installFolder, TORRC_ASSET_KEY, false); + is = context.getResources().openRawResource(R.raw.privoxy); - streamToFile(is,installPath + PRIVOXY_ASSET_KEY, false); - + streamToFile(is,installFolder, PRIVOXY_ASSET_KEY, false); + is = context.getResources().openRawResource(R.raw.privoxy_config); - streamToFile(is,installPath + PRIVOXYCONFIG_ASSET_KEY, false); + streamToFile(is,installFolder, PRIVOXYCONFIG_ASSET_KEY, false);
- - - Log.d(TAG,"SUCCESS: installed tor, privoxy binaries from raw"); - - - } - - /* - private void installFromZip () - { - - try - { - - ZipFile zip = new ZipFile(apkPath); - - ZipEntry zipen = zip.getEntry(ASSETS_BASE + TOR_BINARY_ASSET_KEY); - streamToFile(zip.getInputStream(zipen),installPath + TOR_BINARY_ASSET_KEY, false); - - zipen = zip.getEntry(ASSETS_BASE + TORRC_ASSET_KEY); - streamToFile(zip.getInputStream(zipen),installPath + TORRC_ASSET_KEY); - - zipen = zip.getEntry(ASSETS_BASE + PRIVOXY_ASSET_KEY); - streamToFile(zip.getInputStream(zipen),installPath + PRIVOXY_ASSET_KEY); - - zipen = zip.getEntry(ASSETS_BASE + PRIVOXYCONFIG_ASSET_KEY); - streamToFile(zip.getInputStream(zipen),installPath + PRIVOXYCONFIG_ASSET_KEY); - - zipen = zip.getEntry(ASSETS_BASE + PRIVOXYCONFIG_ASSET_KEY); - streamToFile(zip.getInputStream(zipen),installPath + PRIVOXYCONFIG_ASSET_KEY); - - - zip.close(); - - Log.d(TAG,"SUCCESS: unzipped tor, privoxy, iptables binaries from apk"); - } catch (IOException ioe) { - Log.d(TAG,"FAIL: unable to unzip binaries from apk",ioe); - + Log.e(TAG, "unable to install tor binaries from raw", ioe); + return false; } + + + return true; } - */ + /* * Write the inputstream contents to the file */ - private static void streamToFile(InputStream stm, String targetFilename, boolean append) + private static boolean streamToFile(InputStream stm, File folder, String targetFilename, boolean append) throws IOException
{ - - FileOutputStream stmOut = null; - byte[] buffer = new byte[FILE_WRITE_BUFFER_SIZE];
int bytecount;
- - File outFile = new File(targetFilename); - - try { - if (!append) - outFile.createNewFile(); - - stmOut = new FileOutputStream(outFile); - } + File outFile = new File(folder, targetFilename);
- catch (java.io.IOException e) + FileOutputStream stmOut = new FileOutputStream(outFile, append); + + while ((bytecount = stm.read(buffer)) > 0)
{
- Log.d(TAG,"Error opening output file " + targetFilename,e); + stmOut.write(buffer, 0, bytecount);
- return; }
- - - try + stmOut.close();
- { - - while ((bytecount = stm.read(buffer)) > 0) - - { - - stmOut.write(buffer, 0, bytecount); - - } - - stmOut.close(); - - } - - catch (java.io.IOException e) - - { - - Log.d(TAG,"Error writing output file '" + targetFilename + "': " + e.toString()); - - return; - - } + + return true;
} diff --git a/src/org/torproject/android/service/TorService.java b/src/org/torproject/android/service/TorService.java index 57c43b0..0f9cee3 100644 --- a/src/org/torproject/android/service/TorService.java +++ b/src/org/torproject/android/service/TorService.java @@ -60,16 +60,13 @@ public class TorService extends Service implements TorServiceConstants, Runnable private ArrayList<String> resetBuffer = null;
- private String appHome; - private String appBinHome; - private String appDataHome; + // private String appHome; + private File appBinHome; + private File appDataHome;
private String torBinaryPath; private String privoxyPath;
- - private boolean hasRoot = false; - /** Called when the activity is first created. */ public void onCreate() { super.onCreate(); @@ -419,36 +416,34 @@ public class TorService extends Service implements TorServiceConstants, Runnable //check and install iptables IptablesManager.assertBinaries(this, true); - File fileInstall = getDir("bin/",0); - appHome = fileInstall.getAbsolutePath(); - appDataHome = getCacheDir().getAbsolutePath() + '/'; - logNotice( "appHome=" + appHome); - - torBinaryPath = appBinHome + TOR_BINARY_ASSET_KEY; - privoxyPath = appBinHome + PRIVOXY_ASSET_KEY; + appBinHome = getDir("bin",0); + appDataHome = getCacheDir(); + // logNotice( "appHome=" + appHome); + + File fileTor = new File(appBinHome, TOR_BINARY_ASSET_KEY); + File filePrivoxy = new File(appBinHome, PRIVOXY_ASSET_KEY); + + logNotice( "checking Tor binaries"); - - boolean torBinaryExists = new File(torBinaryPath).exists(); - boolean privoxyBinaryExists = new File(privoxyPath).exists(); - if (!(torBinaryExists && privoxyBinaryExists)) + if (!(fileTor.exists() && filePrivoxy.exists())) { killTorProcess (); - TorBinaryInstaller installer = new TorBinaryInstaller(this, appBinHome, appBinHome); - installer.start(true); - - torBinaryExists = new File(torBinaryPath).exists(); - privoxyBinaryExists = new File(privoxyPath).exists(); + TorBinaryInstaller installer = new TorBinaryInstaller(this, appBinHome); + boolean success = installer.installFromRaw(); - if (torBinaryExists && privoxyBinaryExists) + if (success) { logNotice(getString(R.string.status_install_success)); showToolbarNotification(getString(R.string.status_install_success), NOTIFY_ID, R.drawable.tornotification); + + torBinaryPath = fileTor.getAbsolutePath(); + privoxyPath = filePrivoxy.getAbsolutePath(); } else { @@ -466,6 +461,9 @@ public class TorService extends Service implements TorServiceConstants, Runnable logNotice("Found Tor binary: " + torBinaryPath); logNotice("Found Privoxy binary: " + privoxyPath);
+ + torBinaryPath = fileTor.getAbsolutePath(); + privoxyPath = filePrivoxy.getAbsolutePath(); } StringBuilder log = new StringBuilder (); @@ -627,9 +625,9 @@ public class TorService extends Service implements TorServiceConstants, Runnable StringBuilder log = new StringBuilder(); - String torrcPath = appBinHome + TORRC_ASSET_KEY; + String torrcPath = new File(appBinHome, TORRC_ASSET_KEY).getAbsolutePath(); - String[] torCmd = {torBinaryPath + " DataDirectory " + appDataHome + " -f " + torrcPath + " || exit\n"}; + String[] torCmd = {torBinaryPath + " DataDirectory " + appDataHome.getAbsolutePath() + " -f " + torrcPath + " || exit\n"}; boolean runAsRootFalse = false; boolean waitForProcess = false; @@ -697,7 +695,7 @@ public class TorService extends Service implements TorServiceConstants, Runnable { log = new StringBuilder(); - String privoxyConfigPath = appBinHome + PRIVOXYCONFIG_ASSET_KEY; + String privoxyConfigPath = new File(appBinHome, PRIVOXYCONFIG_ASSET_KEY).getAbsolutePath(); String[] cmds = { privoxyPath + " " + privoxyConfigPath + " &" }; @@ -762,7 +760,7 @@ public class TorService extends Service implements TorServiceConstants, Runnable
logNotice( "SUCCESS connected to control port"); - String torAuthCookie = appDataHome + TOR_CONTROL_COOKIE; + String torAuthCookie = new File(appDataHome, TOR_CONTROL_COOKIE).getAbsolutePath(); File fileCookie = new File(torAuthCookie); @@ -1406,7 +1404,7 @@ public class TorService extends Service implements TorServiceConstants, Runnable
if (enableHiddenServices) { - mBinder.updateConfiguration("HiddenServiceDir",appDataHome, false); + mBinder.updateConfiguration("HiddenServiceDir",appDataHome.getAbsolutePath(), false); String hsPorts = prefs.getString("pref_hs_ports","");
tor-commits@lists.torproject.org