Author: n8fr8 Date: 2011-04-15 16:37:33 +0000 (Fri, 15 Apr 2011) New Revision: 24627
Modified: projects/android/trunk/Orbot/src/org/torproject/android/service/TorBinaryInstaller.java projects/android/trunk/Orbot/src/org/torproject/android/service/TorService.java projects/android/trunk/Orbot/src/org/torproject/android/service/TorServiceConstants.java projects/android/trunk/Orbot/src/org/torproject/android/service/TorServiceUtils.java projects/android/trunk/Orbot/src/org/torproject/android/service/TorTransProxy.java Log: update to service with new transproxy/iptables code
Modified: projects/android/trunk/Orbot/src/org/torproject/android/service/TorBinaryInstaller.java =================================================================== --- projects/android/trunk/Orbot/src/org/torproject/android/service/TorBinaryInstaller.java 2011-04-15 16:36:36 UTC (rev 24626) +++ projects/android/trunk/Orbot/src/org/torproject/android/service/TorBinaryInstaller.java 2011-04-15 16:37:33 UTC (rev 24627) @@ -12,18 +12,23 @@ import java.util.zip.ZipEntry; import java.util.zip.ZipFile;
+import org.torproject.android.R; + +import android.content.Context; import android.util.Log;
public class TorBinaryInstaller implements TorServiceConstants {
- String installPath = null; - String apkPath = null; + String installPath; + String apkPath; + Context context; - public TorBinaryInstaller (String installPath, String apkPath) + public TorBinaryInstaller (Context context, String installPath, String apkPath) { this.installPath = installPath; this.apkPath = apkPath; + this.context = context; } /* @@ -39,13 +44,42 @@ Log.d(TAG,"Privoxy binary exists=" + privoxyBinaryExists); if (!(torBinaryExists && privoxyBinaryExists) || force) - installFromZip (); + installFromRaw (); + + } + // /* * Extract the Tor binary from the APK file using ZIP */ + private void installFromRaw () + { + + + InputStream is = context.getResources().openRawResource(R.raw.tor); + streamToFile(is,installPath + TOR_BINARY_ASSET_KEY); + + + is = context.getResources().openRawResource(R.raw.torrc); + streamToFile(is,installPath + TORRC_ASSET_KEY); + + is = context.getResources().openRawResource(R.raw.privoxy); + streamToFile(is,installPath + PRIVOXY_ASSET_KEY); + + is = context.getResources().openRawResource(R.raw.privoxy_config); + streamToFile(is,installPath + PRIVOXYCONFIG_ASSET_KEY); + + + + Log.d(TAG,"SUCCESS: installed tor, privoxy binaries from raw"); + + + } + /* + * Extract the Tor binary from the APK file using ZIP + */ private void installFromZip () {
Modified: projects/android/trunk/Orbot/src/org/torproject/android/service/TorService.java =================================================================== --- projects/android/trunk/Orbot/src/org/torproject/android/service/TorService.java 2011-04-15 16:36:36 UTC (rev 24626) +++ projects/android/trunk/Orbot/src/org/torproject/android/service/TorService.java 2011-04-15 16:37:33 UTC (rev 24627) @@ -52,12 +52,16 @@ private static final int MAX_START_TRIES = 3;
private ArrayList<String> configBuffer = null; - + private ArrayList<String> resetBuffer = null; +
- private String appHome = "/data/data/" + TOR_APP_USERNAME + "/";; - private String torBinaryPath = appHome + TOR_BINARY_ASSET_KEY; - private String privoxyPath = appHome + PRIVOXY_ASSET_KEY; + private String appHome; + private String appBinHome; + private String appDataHome;
+ private String torBinaryPath; + private String privoxyPath; + private boolean hasRoot = false;
@@ -323,7 +327,8 @@ String[] cmd = { SHELL_CMD_KILL + ' ' + procId + "" }; TorServiceUtils.doShellCommand(cmd,log, false, false); - + try { Thread.sleep(500); } + catch (Exception e){} }
while ((procId = TorServiceUtils.findProcessId(privoxyPath)) != -1) @@ -333,7 +338,8 @@ String[] cmd = { SHELL_CMD_KILL + ' ' + procId + "" };
TorServiceUtils.doShellCommand(cmd,log, false, false); - + try { Thread.sleep(500); } + catch (Exception e){} } } @@ -349,6 +355,7 @@ } }
+ /* private String findAPK () { @@ -428,39 +435,29 @@ return null; - } + }*/
+ private boolean checkTorBinaries () throws Exception { + //android.os.Debug.waitForDebugger(); - appHome = "/data/data/" + TOR_APP_USERNAME + "/"; - //appHome = getApplicationContext().getFilesDir().getAbsolutePath(); + //check and install iptables + Api.assertBinaries(this, true); + File fileInstall = getDir("",0); + String subBinPath = "bin/"; + + appHome = fileInstall.getAbsolutePath(); + appBinHome = appHome + subBinPath; + appDataHome = getCacheDir().getAbsolutePath() + '/'; logNotice( "appHome=" + appHome); - torBinaryPath = appHome + TOR_BINARY_ASSET_KEY; - privoxyPath = appHome + PRIVOXY_ASSET_KEY; + + torBinaryPath = appBinHome + TOR_BINARY_ASSET_KEY; + privoxyPath = appBinHome + PRIVOXY_ASSET_KEY; logNotice( "checking Tor binaries"); - - String apkPath = findAPK(); - - if (apkPath == null) - throw new Exception ("Unable to locate Orbot binary APK file"); - - logNotice( "found apk at: " + apkPath); - - boolean apkExists = new File(apkPath).exists(); - - if (!apkExists) - { - Log.w(TAG,"APK file not found at: " + apkPath); - Log.w(TAG,"Binary installation aborted"); - logNotice(getString(R.string.status_install_fail)); - sendCallbackStatusMessage(getString(R.string.status_install_fail)); - return false; - } - - + boolean torBinaryExists = new File(torBinaryPath).exists(); boolean privoxyBinaryExists = new File(privoxyPath).exists(); @@ -468,7 +465,7 @@ { killTorProcess (); - TorBinaryInstaller installer = new TorBinaryInstaller(appHome, apkPath); + TorBinaryInstaller installer = new TorBinaryInstaller(this, appBinHome, appBinHome); installer.start(true); torBinaryExists = new File(torBinaryPath).exists(); @@ -552,12 +549,11 @@ private void runTorShellCmd() throws Exception { - StringBuilder log = new StringBuilder(); - String torrcPath = appHome + TORRC_ASSET_KEY; + String torrcPath = appBinHome + TORRC_ASSET_KEY; - String[] torCmd = {torBinaryPath + " -f " + torrcPath + " || exit\n"}; + String[] torCmd = {torBinaryPath + " DataDirectory " + appDataHome + " -f " + torrcPath + " || exit\n"}; boolean runAsRootFalse = false; boolean waitForProcess = false; @@ -623,7 +619,7 @@ { log = new StringBuilder(); - String privoxyConfigPath = appHome + PRIVOXYCONFIG_ASSET_KEY; + String privoxyConfigPath = appBinHome + PRIVOXYCONFIG_ASSET_KEY; String[] cmds = { privoxyPath + " " + privoxyConfigPath + " &" }; @@ -680,28 +676,32 @@ torConnSocket = new Socket(IP_LOCALHOST, TOR_CONTROL_PORT); conn = TorControlConnection.getConnection(torConnSocket); + // conn.authenticate(new byte[0]); // See section 3.2 sendCallbackStatusMessage(getString(R.string.tor_process_connecting_step2));
logNotice( "SUCCESS connected to control port"); - String torAuthCookie = appHome + "data/control_auth_cookie"; + String torAuthCookie = appDataHome + TOR_CONTROL_COOKIE; File fileCookie = new File(torAuthCookie); - byte[] cookie = new byte[(int)fileCookie.length()]; - new FileInputStream(new File(torAuthCookie)).read(cookie); - conn.authenticate(cookie); - - logNotice( "SUCCESS authenticated to control port"); - sendCallbackStatusMessage(getString(R.string.tor_process_connecting_step2) + getString(R.string.tor_process_connecting_step3)); - - addEventHandler(); + if (fileCookie.exists()) + { + byte[] cookie = new byte[(int)fileCookie.length()]; + new FileInputStream(new File(torAuthCookie)).read(cookie); + conn.authenticate(cookie); + + logNotice( "SUCCESS authenticated to control port"); + + sendCallbackStatusMessage(getString(R.string.tor_process_connecting_step2) + getString(R.string.tor_process_connecting_step3)); + + addEventHandler(); + + applyPreferences(); + } - applyPreferences(); - - break; //don't need to retry } catch (Exception ce) @@ -712,8 +712,7 @@ sendCallbackStatusMessage(getString(R.string.tor_process_connecting_step4));
Thread.sleep(1000); - - + } } @@ -1052,9 +1051,14 @@ { if (configBuffer == null) configBuffer = new ArrayList<String>(); - + + if (resetBuffer == null) + resetBuffer = new ArrayList<String>(); + if (value == null || value.length() == 0) { + + /* if (conn != null) { try { @@ -1063,6 +1067,9 @@ Log.w(TAG, "Unable to reset conf",e); } } + */ + + resetBuffer.add(name); } else configBuffer.add(name + ' ' + value); @@ -1076,8 +1083,16 @@ { if (conn != null) { - if (configBuffer != null) + if (resetBuffer != null && resetBuffer.size() > 0) + { + conn.resetConf(resetBuffer); + resetBuffer = null; + } + + + if (configBuffer != null && configBuffer.size() > 0) { + conn.setConf(configBuffer); configBuffer = null; } @@ -1378,14 +1393,14 @@ } else { - TorTransProxy.purgeIptables(this,AppManager.getApps(this)); + TorTransProxy.purgeIptables(this); } } } else if (hasRoot) { - TorTransProxy.purgeIptables(this,AppManager.getApps(this)); + TorTransProxy.purgeIptables(this); } return true;
Modified: projects/android/trunk/Orbot/src/org/torproject/android/service/TorServiceConstants.java =================================================================== --- projects/android/trunk/Orbot/src/org/torproject/android/service/TorServiceConstants.java 2011-04-15 16:36:36 UTC (rev 24626) +++ projects/android/trunk/Orbot/src/org/torproject/android/service/TorServiceConstants.java 2011-04-15 16:37:33 UTC (rev 24627) @@ -19,7 +19,8 @@ //torrc (tor config file) public final static String TORRC_ASSET_KEY = "torrc"; - + public final static String TOR_CONTROL_COOKIE = "control_auth_cookie"; + //how to launch tor // public final static String TOR_COMMAND_LINE_ARGS = "-f " + TORRC_INSTALL_PATH + " || exit\n"; @@ -39,8 +40,8 @@ public final static String CHMOD_EXE_VALUE = "777"; //path of the installed APK file - public final static String APK_PATH = "/data/app/org.torproject.android.apk"; - public final static String APK_PATH_BASE = "/data/app"; + //public final static String APK_PATH = "/data/app/org.torproject.android.apk"; + //public final static String APK_PATH_BASE = "/data/app";
Modified: projects/android/trunk/Orbot/src/org/torproject/android/service/TorServiceUtils.java =================================================================== --- projects/android/trunk/Orbot/src/org/torproject/android/service/TorServiceUtils.java 2011-04-15 16:36:36 UTC (rev 24626) +++ projects/android/trunk/Orbot/src/org/torproject/android/service/TorServiceUtils.java 2011-04-15 16:37:33 UTC (rev 24627) @@ -165,7 +165,6 @@ else proc = Runtime.getRuntime().exec("sh"); - OutputStreamWriter out = new OutputStreamWriter(proc.getOutputStream());
for (int i = 0; i < cmds.length; i++) @@ -181,8 +180,6 @@ if (waitFor) { - - final char buf[] = new char[10]; // Consume the "stdout"
Modified: projects/android/trunk/Orbot/src/org/torproject/android/service/TorTransProxy.java =================================================================== --- projects/android/trunk/Orbot/src/org/torproject/android/service/TorTransProxy.java 2011-04-15 16:36:36 UTC (rev 24626) +++ projects/android/trunk/Orbot/src/org/torproject/android/service/TorTransProxy.java 2011-04-15 16:37:33 UTC (rev 24627) @@ -1,5 +1,7 @@ package org.torproject.android.service;
+import java.io.File; + import org.torproject.android.TorifiedApp;
import android.content.Context; @@ -21,6 +23,7 @@ * Check if we have root access * @return boolean true if we have root */ + /* public static String getIPTablesVersion() {
@@ -52,43 +55,42 @@ logNotice("Could not acquire check iptables: " + log.toString()); return null; - } + }*/ - - private static String findBaseDir () - { - - return ""; //just blank for now - /* - String[] cmds = {"/system/bin/iptables -t nat --list"}; + public static int purgeIptables(Context context) throws Exception { + + String ipTablesPath = new File(context.getDir("bin", 0),"iptables_n1").getAbsolutePath(); + + final StringBuilder script = new StringBuilder(); + StringBuilder res = new StringBuilder(); + int code = -1; +
- int code; - try { - code = TorServiceUtils.doShellCommand(cmds, res, true, true); + script.append(ipTablesPath); + script.append(" -t nat"); + script.append(" -F || exit\n"); + script.append(ipTablesPath); + script.append(" -t filter"); + script.append(" -F || exit\n"); + + String[] cmd = {script.toString()}; + code = TorServiceUtils.doShellCommand(cmd, res, true, true); + String msg = res.toString(); + logNotice(cmd[0] + ";errCode=" + code + ";resp=" + msg); + - if (code != 0) { - return BASE_DIR; - } - else - return "/system/bin/"; - - } catch (Exception e) { - return BASE_DIR; - } - - return ""; - - */ + return code; + } + /* + public static int purgeIptablesByApp(Context context, TorifiedApp[] apps) throws Exception {
- public static int purgeIptables(Context context, TorifiedApp[] apps) throws Exception { - //restoreDNSResolvConf(); //not working yet - String baseDir = findBaseDir(); + String ipTablesPath = new File(context.getDir("bin", 0),"iptables_n1").getAbsolutePath(); final StringBuilder script = new StringBuilder(); @@ -97,13 +99,14 @@ for (int i = 0; i < apps.length; i++) { - //flush nat for every app - script.append(baseDir); - script.append("iptables -t nat -m owner --uid-owner "); + script.append(ipTablesPath); + script.append(" -t nat -m owner --uid-owner "); script.append(apps[i].getUid()); script.append(" -F || exit\n"); - script.append("iptables -t filter -m owner --uid-owner "); + + script.append(ipTablesPath); + script.append(" -t filter -m owner --uid-owner "); script.append(apps[i].getUid()); script.append(" -F || exit\n"); @@ -118,8 +121,9 @@ return code; - } + }*/ + /* // 9/19/2010 - NF This code is in process... /etc path on System partition // is read-only on Android for now. @@ -171,39 +175,18 @@ //redirectDNSResolvConf(); //not working yet - String baseDir = findBaseDir(); + //String baseDir = context.getDir("bin", 0).getAbsolutePath() + "/"; + String ipTablesPath = new File(context.getDir("bin", 0),"iptables_n1").getAbsolutePath();
- String iptablesVersion = getIPTablesVersion(); - logNotice( "iptables version: " + iptablesVersion); - boolean ipTablesOld = false; - if (iptablesVersion != null && iptablesVersion.startsWith("1.3")){ - ipTablesOld = true; - } StringBuilder script = new StringBuilder(); StringBuilder res = new StringBuilder(); int code = -1; - for (int i = 0; i < apps.length; i++) - { - - //flush nat for every app - script.append(baseDir); - script.append("iptables -t nat -m owner --uid-owner "); - script.append(apps[i].getUid()); - script.append(" -F || exit\n"); - script.append("iptables -t filter -m owner --uid-owner "); - script.append(apps[i].getUid()); - script.append(" -F || exit\n"); - - } + purgeIptables(context); - String[] cmdFlush = {script.toString()}; - code = TorServiceUtils.doShellCommand(cmdFlush, res, true, true); - //String msg = res.toString(); //get stdout from command - script = new StringBuilder(); //build up array of shell cmds to execute under one root context @@ -231,8 +214,8 @@ //iptables -t nat -A output -p tcp -m owner --uid-owner 100 -m tcp --sync -j REDIRECT --to-ports 9040 //TCP - script.append(baseDir); - script.append("iptables -t nat"); + script.append(ipTablesPath); + script.append(" -t nat"); script.append(" -A OUTPUT -p tcp"); script.append(" -m owner --uid-owner "); script.append(apps[i].getUid()); @@ -248,8 +231,8 @@ script.append(" || exit\n"); //DNS - script.append(baseDir); - script.append("iptables -t nat"); + script.append(ipTablesPath); + script.append(" -t nat"); script.append(" -A OUTPUT -p udp -m owner --uid-owner "); script.append(apps[i].getUid()); script.append(" -m udp --dport "); @@ -268,8 +251,8 @@ //EVERYTHING ELSE - DROP! if (ipTablesOld) //for some reason this doesn't work on iptables 1.3.7 { - - script.append("iptables -t nat"); + script.append(ipTablesPath); + script.append(" -t nat"); script.append(" -A OUTPUT -m owner --uid-owner "); script.append(apps[i].getUid()); script.append(" -j DROP"); @@ -277,8 +260,8 @@ } else { - script.append(baseDir); - script.append("iptables -t filter"); + script.append(ipTablesPath); + script.append(" -t filter"); script.append(" -A OUTPUT -p tcp"); script.append(" -m owner --uid-owner "); script.append(apps[i].getUid()); @@ -287,8 +270,8 @@ script.append(" -j ACCEPT"); script.append(" || exit\n"); - script.append(baseDir); - script.append("iptables -t filter"); + script.append(ipTablesPath); + script.append(" -t filter"); script.append(" -A OUTPUT -p udp"); script.append(" -m owner --uid-owner "); script.append(apps[i].getUid()); @@ -297,8 +280,7 @@ script.append(" -j ACCEPT"); script.append(" || exit\n"); - script.append(baseDir); - script.append("iptables"); + script.append(ipTablesPath); script.append(" -t filter -A OUTPUT -m owner --uid-owner "); script.append(apps[i].getUid()); script.append(" -j DROP"); //drop all other packets as Tor won't handle them @@ -307,6 +289,9 @@ } } + else + { + } } @@ -325,15 +310,10 @@ //redirectDNSResolvConf(); //not working yet - String baseDir = findBaseDir(); + //String baseDir = context.getDir("bin",0).getAbsolutePath() + '/'; + String ipTablesPath = new File(context.getDir("bin", 0),"iptables_n1").getAbsolutePath();
- String iptablesVersion = getIPTablesVersion(); - logNotice( "iptables version: " + iptablesVersion); - boolean ipTablesOld = false; - if (iptablesVersion != null && iptablesVersion.startsWith("1.3")){ - ipTablesOld = true; - } StringBuilder script = new StringBuilder(); @@ -349,8 +329,8 @@ //TCP //iptables -t nat -A PREROUTING -i eth0 -p tcp --dport $srcPortNumber -j REDIRECT --to-port $dstPortNumbe
- script.append(baseDir); - script.append("iptables -t nat"); + script.append(ipTablesPath); + script.append(" -t nat"); script.append(" -A OUTPUT -p tcp"); script.append(" --dport "); script.append(port); @@ -365,8 +345,8 @@ script.append(" || exit\n"); - script.append(baseDir); - script.append("iptables -t nat"); + script.append(ipTablesPath); + script.append(" -t nat"); script.append(" -A OUTPUT -p udp"); script.append(" --dport "); script.append(port); @@ -381,8 +361,8 @@ script.append(" || exit\n"); //DNS - script.append(baseDir); - script.append("iptables -t nat"); + script.append(ipTablesPath); + script.append(" -t nat"); script.append(" -A OUTPUT -p udp "); script.append(" -m udp --dport "); script.append(STANDARD_DNS_PORT);
tor-commits@lists.torproject.org