[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]
[or-cvs] r22743: {projects} updates related to motorola milestone debugging and iptables (in projects/android/trunk/Orbot: . src/org/torproject/android src/org/torproject/android/service)
Author: n8fr8
Date: 2010-07-31 15:43:56 +0000 (Sat, 31 Jul 2010)
New Revision: 22743
Modified:
projects/android/trunk/Orbot/AndroidManifest.xml
projects/android/trunk/Orbot/src/org/torproject/android/Orbot.java
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/TorTransProxy.java
Log:
updates related to motorola milestone debugging and iptables transproxy settings
Modified: projects/android/trunk/Orbot/AndroidManifest.xml
===================================================================
--- projects/android/trunk/Orbot/AndroidManifest.xml 2010-07-31 15:43:47 UTC (rev 22742)
+++ projects/android/trunk/Orbot/AndroidManifest.xml 2010-07-31 15:43:56 UTC (rev 22743)
@@ -5,7 +5,7 @@
<uses-permission android:name="android.permission.INTERNET" />
- <application android:icon="@drawable/icon" android:label="@string/app_name" android:debuggable="false">
+ <application android:icon="@drawable/icon" android:label="@string/app_name" android:debuggable="true">
<activity android:name=".Orbot"
android:theme="@android:style/Theme.NoTitleBar"
Modified: projects/android/trunk/Orbot/src/org/torproject/android/Orbot.java
===================================================================
--- projects/android/trunk/Orbot/src/org/torproject/android/Orbot.java 2010-07-31 15:43:47 UTC (rev 22742)
+++ projects/android/trunk/Orbot/src/org/torproject/android/Orbot.java 2010-07-31 15:43:56 UTC (rev 22743)
@@ -390,135 +390,8 @@
* Read in the Preferences and write then to the .torrc file
*/
- /*
- private void processSettingsOld ()
- {
- StringBuffer torrcText = new StringBuffer();
-
- torrcText.append(TorConstants.TORRC_DEFAULT);
-
- SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
-
- boolean useBridges = prefs.getBoolean(PREF_BRIDGES_ENABLED, false);
-
- boolean autoUpdateBridges = prefs.getBoolean(PREF_BRIDGES_UPDATED, false);
-
- boolean becomeRelay = prefs.getBoolean(PREF_OR, false);
-
- boolean ReachableAddresses = prefs.getBoolean(PREF_REACHABLE_ADDRESSES,false);
-
- enableTransparentProxy = prefs.getBoolean(PREF_TRANSPARENT, false);
-
- if (hasRoot)
- {
- if (enableTransparentProxy)
- {
- TorTransProxy.setDNSProxying();
- TorTransProxy.setTransparentProxying(this, TorServiceUtils.getApps(this));
- }
- else
- {
- TorTransProxy.purgeNatIptables();
- }
-
- }
-
- String bridgeList = prefs.getString(PREF_BRIDGES_LIST,"");
-
- if (useBridges)
- {
- if (bridgeList == null || bridgeList.length() == 0)
- {
-
- showAlert("Bridge Error","In order to use the bridge feature, you must enter at least one bridge IP address." +
- "Send an email to bridges@xxxxxxxxxxxxxx with the line \"get bridges\" by itself in the body of the mail from a gmail account.");
-
- showSettings();
- return;
- }
-
-
- torrcText.append("UseBridges 1");
- torrcText.append('\n');
-
- torrcText.append("UpdateBridgesFromAuthority ");
-
- if (autoUpdateBridges)
- torrcText.append("1");
- else
- torrcText.append("0");
-
- torrcText.append('\n');
-
- String bridgeDelim = "\n";
-
- if (bridgeList.indexOf(",") != -1)
- {
- bridgeDelim = ",";
- }
-
- StringTokenizer st = new StringTokenizer(bridgeList,bridgeDelim);
- while (st.hasMoreTokens())
- {
- torrcText.append("bridge ");
- torrcText.append(st.nextToken());
- torrcText.append('\n');
-
- }
- }
- else
- {
- torrcText.append("UseBridges 0");
- torrcText.append('\n');
- }
-
- try
- {
- if (ReachableAddresses)
- {
- String ReachableAddressesPorts =
- prefs.getString(PREF_REACHABLE_ADDRESSES_PORTS, "*:80,*:443");
- torrcText.append("ReachableAddresses ");
- // We should verify this and someday, the Exception will matter :-)
- torrcText.append(ReachableAddressesPorts);
- torrcText.append('\n');
- }
- }
- catch (Exception e)
- {
- showAlert("Config Error","Your ReachableAddresses settings caused an exception!");
- }
-
- try
- {
- if (becomeRelay && (!useBridges) && (!ReachableAddresses))
- {
- int ORPort = Integer.parseInt(prefs.getString(PREF_OR_PORT, "9001"));
- String nickname = prefs.getString(PREF_OR_NICKNAME, "Orbot");
-
- torrcText.append("ORPort ");
- torrcText.append(ORPort);
- torrcText.append('\n');
-
- torrcText.append("Nickname ");
- torrcText.append(nickname);
- torrcText.append('\n');
-
- torrcText.append("ExitPolicy reject *:*");
- torrcText.append('\n');
- }
- }
- catch (Exception e)
- {
- showAlert("Uh-oh!","Your relay settings caused an exception!");
- showSettings();
- return;
- }
-
- Utils.saveTextFile(TorServiceConstants.TORRC_INSTALL_PATH, torrcText.toString());
- }
- */
+
private void processSettings () throws RemoteException
{
Modified: projects/android/trunk/Orbot/src/org/torproject/android/service/TorBinaryInstaller.java
===================================================================
--- projects/android/trunk/Orbot/src/org/torproject/android/service/TorBinaryInstaller.java 2010-07-31 15:43:47 UTC (rev 22742)
+++ projects/android/trunk/Orbot/src/org/torproject/android/service/TorBinaryInstaller.java 2010-07-31 15:43:56 UTC (rev 22743)
@@ -38,7 +38,10 @@
boolean privoxyBinaryExists = new File(installPath + PRIVOXY_ASSET_KEY).exists();
Log.i(TAG,"Privoxy binary exists=" + privoxyBinaryExists);
- if (!(torBinaryExists && privoxyBinaryExists) || force)
+ boolean iptablesBinaryExists = new File(installPath + IPTABLES_ASSET_KEY).exists();
+ Log.i(TAG,"IPTables binary exists=" + iptablesBinaryExists);
+
+ if (!(torBinaryExists && privoxyBinaryExists && iptablesBinaryExists) || force)
installFromZip ();
}
@@ -51,39 +54,31 @@
try
{
- /*
- String apkPath = APK_PATH;
- int apkIdx = 1;
-
- while (!new File(apkPath).exists())
- {
- apkPath = APK_PATH_BASE + '-' + (apkIdx++) + ".apk";
-
- Log.i(TAG,"Could not find APK. Trying new path: " + apkPath);
- }
- */
-
-
-
ZipFile zip = new ZipFile(apkPath);
- ZipEntry zipen = zip.getEntry(TOR_BINARY_ZIP_KEY);
+ ZipEntry zipen = zip.getEntry(ASSETS_BASE + TOR_BINARY_ASSET_KEY);
streamToFile(zip.getInputStream(zipen),installPath + TOR_BINARY_ASSET_KEY);
- zipen = zip.getEntry(TORRC_ZIP_KEY);
+ zipen = zip.getEntry(ASSETS_BASE + TORRC_ASSET_KEY);
streamToFile(zip.getInputStream(zipen),installPath + TORRC_ASSET_KEY);
- zipen = zip.getEntry(PRIVOXY_ZIP_KEY);
+ zipen = zip.getEntry(ASSETS_BASE + PRIVOXY_ASSET_KEY);
streamToFile(zip.getInputStream(zipen),installPath + PRIVOXY_ASSET_KEY);
- zipen = zip.getEntry(PRIVOXYCONFIG_ZIP_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);
+ zipen = zip.getEntry(ASSETS_BASE + IPTABLES_ASSET_KEY);
+ streamToFile(zip.getInputStream(zipen),installPath + IPTABLES_ASSET_KEY);
+
+
zip.close();
- Log.i(TAG,"SUCCESS: unzipped tor, privoxy binaries from apk");
+ Log.i(TAG,"SUCCESS: unzipped tor, privoxy, iptables binaries from apk");
}
catch (IOException ioe)
Modified: projects/android/trunk/Orbot/src/org/torproject/android/service/TorService.java
===================================================================
--- projects/android/trunk/Orbot/src/org/torproject/android/service/TorService.java 2010-07-31 15:43:47 UTC (rev 22742)
+++ projects/android/trunk/Orbot/src/org/torproject/android/service/TorService.java 2010-07-31 15:43:56 UTC (rev 22743)
@@ -401,11 +401,13 @@
torBinaryPath = appHome + TOR_BINARY_ASSET_KEY;
privoxyPath = appHome + PRIVOXY_ASSET_KEY;
+ String iptablesPath = appHome + IPTABLES_ASSET_KEY;
boolean torBinaryExists = new File(torBinaryPath).exists();
boolean privoxyBinaryExists = new File(privoxyPath).exists();
+ boolean iptablesBinaryExists = new File(iptablesPath).exists();
- if (!(torBinaryExists && privoxyBinaryExists))
+ if (!(torBinaryExists && privoxyBinaryExists && iptablesBinaryExists))
{
killTorProcess ();
@@ -415,7 +417,7 @@
torBinaryExists = new File(torBinaryPath).exists();
privoxyBinaryExists = new File(privoxyPath).exists();
- if (torBinaryExists && privoxyBinaryExists)
+ if (torBinaryExists && privoxyBinaryExists && iptablesBinaryExists)
{
logNotice(getString(R.string.status_install_success));
@@ -429,8 +431,6 @@
sendCallbackMessage(getString(R.string.status_install_fail));
- //showAlert(getString(R.string.title_error),getString(R.string.status_install_fail));
-
return false;
}
@@ -439,8 +439,10 @@
{
logNotice("Found Tor binary: " + torBinaryPath);
- logNotice("Found prvoxy binary: " + privoxyPath);
+ logNotice("Found privoxy binary: " + privoxyPath);
+ logNotice("Found iptables binary: " + iptablesPath);
+
}
StringBuilder log = new StringBuilder ();
@@ -453,6 +455,10 @@
String[] cmd2 = {SHELL_CMD_CHMOD + ' ' + CHMOD_EXE_VALUE + ' ' + privoxyPath};
TorServiceUtils.doShellCommand(cmd2, log, false, true);
+ logNotice("(re)Setting permission on iptables binary");
+ String[] cmd3 = {SHELL_CMD_CHMOD + ' ' + CHMOD_EXE_VALUE + ' ' + iptablesPath};
+ TorServiceUtils.doShellCommand(cmd3, log, false, true);
+
return true;
}
@@ -1181,15 +1187,15 @@
logNotice ("TorTransProxy enabled: " + success);
} catch (Exception e) {
+
logNotice("WARNING: Error configuring transparenty proxying: " + e.getMessage());
-
Log.w(TAG, "error refreshing iptables: err=" + e.getMessage(), e);
}
}
else
{
- TorTransProxy.purgeNatIptables();
+ TorTransProxy.purgeIptables();
}
}
@@ -1197,7 +1203,7 @@
{
if (hasRoot)
{
- TorTransProxy.purgeNatIptables();
+ TorTransProxy.purgeIptables();
}
}
}
Modified: projects/android/trunk/Orbot/src/org/torproject/android/service/TorServiceConstants.java
===================================================================
--- projects/android/trunk/Orbot/src/org/torproject/android/service/TorServiceConstants.java 2010-07-31 15:43:47 UTC (rev 22742)
+++ projects/android/trunk/Orbot/src/org/torproject/android/service/TorServiceConstants.java 2010-07-31 15:43:56 UTC (rev 22743)
@@ -8,43 +8,28 @@
public final static String TOR_APP_USERNAME = "org.torproject.android";
+ public final static String ASSETS_BASE = "assets/";
+
//home directory of Android application
-// public final static String TOR_HOME = "/data/data/" + TOR_APP_USERNAME + "/";
-
- //public final static String TOR_HOME_DATA_DIR = TOR_HOME + "data/";
//name of the tor C binary
public final static String TOR_BINARY_ASSET_KEY = "tor";
-// public final static String TOR_BINARY_INSTALL_PATH = TOR_HOME + TOR_BINARY_ASSET_KEY; //path to install the Tor binary too
- public final static String TOR_BINARY_ZIP_KEY = "assets/" + TOR_BINARY_ASSET_KEY;//key of the tor binary in the Zip file
//torrc (tor config file)
public final static String TORRC_ASSET_KEY = "torrc";
-// public final static String TORRC_INSTALL_PATH = TOR_HOME + TORRC_ASSET_KEY; //path to install torrc to within the android app data folder
- public final static String TORRC_ZIP_KEY = "assets/" + TORRC_ASSET_KEY; //key of the torrc file in the Zip file
+
//how to launch tor
// public final static String TOR_COMMAND_LINE_ARGS = "-f " + TORRC_INSTALL_PATH + " || exit\n";
//privoxy
public final static String PRIVOXY_ASSET_KEY = "privoxy";
-// public final static String PRIVOXY_INSTALL_PATH = TOR_HOME + PRIVOXY_ASSET_KEY; //path to install privoxy to within the android app data folder
- public final static String PRIVOXY_ZIP_KEY = "assets/" + PRIVOXY_ASSET_KEY; //key of the privoxy file in the Zip file
//privoxy.config
public final static String PRIVOXYCONFIG_ASSET_KEY = "privoxy.config";
-// public final static String PRIVOXYCONFIG_INSTALL_PATH = TOR_HOME + PRIVOXYCONFIG_ASSET_KEY; //path to install privoxy to within the android app data folder
- public final static String PRIVOXYCONFIG_ZIP_KEY = "assets/" + PRIVOXYCONFIG_ASSET_KEY; //key of the privoxy file in the Zip file
- //how to launch privoxy
-// public final static String PRIVOXY_COMMAND_LINE_ARGS = ' ' + PRIVOXYCONFIG_INSTALL_PATH + " || exit\n";
-
- //where to send the notices log
-// public final static String TOR_LOG_PATH = TOR_HOME + "notices.log";
-
- //control port cookie path
-// public final static String TOR_CONTROL_AUTH_COOKIE = TOR_HOME_DATA_DIR + "control_auth_cookie";
-
-
+ //iptables key
+ public final static String IPTABLES_ASSET_KEY = "iptables";
+
//various console cmds
public final static String SHELL_CMD_CHMOD = "chmod";
public final static String SHELL_CMD_KILL = "kill";
Modified: projects/android/trunk/Orbot/src/org/torproject/android/service/TorTransProxy.java
===================================================================
--- projects/android/trunk/Orbot/src/org/torproject/android/service/TorTransProxy.java 2010-07-31 15:43:47 UTC (rev 22742)
+++ projects/android/trunk/Orbot/src/org/torproject/android/service/TorTransProxy.java 2010-07-31 15:43:56 UTC (rev 22743)
@@ -1,5 +1,7 @@
package org.torproject.android.service;
+import java.io.File;
+
import org.torproject.android.TorifiedApp;
import android.content.Context;
@@ -9,14 +11,17 @@
private final static String TAG = "TorTransProxy";
+ private static String BASE_DIR = "/data/data/" + TorServiceConstants.TOR_APP_USERNAME + "/";
+
private final static String CMD_NAT_FLUSH = "iptables -t nat -F || exit\n";
+ private final static String CMD_FILTER_FLUSH = "iptables -t filter -F || exit\n";
+
private final static String CMD_DNS_PROXYING_ADD = "iptables -t nat -A PREROUTING -p udp --dport 53 -j DNAT --to 127.0.0.1:5400 || exit\n";
+ private final static String IPTABLES_ADD = " -A ";
+
//private final static String CMD_DNS_PROXYING_DELETE = "iptables -t nat -D PREROUTING -p udp --dport 53 -j DNAT --to 127.0.0.1:5400 || exit\n";
// - just calling a system wide flush of iptables rules
-
- private final static String IPTABLES_ADD = " -A ";
-
//private final static String IPTABLES_DELETE = " -D "; //not deleting manually anymore - just calling a system wide flush of iptables rules
// private final static String IPTABLES_DROP_ALL = " -j DROP ";
@@ -32,7 +37,7 @@
try {
// Run an empty script just to check root access
- String[] cmd = {"whoami"};
+ String[] cmd = {"exit 0"};
int exitCode = TorServiceUtils.doShellCommand(cmd, log, true, true);
if (exitCode == 0) {
@@ -46,13 +51,36 @@
return false;
}
+ private static String findBaseDir ()
+ {
+ String[] cmds = {"/system/bin/iptables -t nat --list"};
+ StringBuilder res = new StringBuilder();
+
+ int code;
+ try {
+ code = TorServiceUtils.doShellCommand(cmds, res, true, true);
+
+
+ if (code != 0) {
+ return BASE_DIR;
+ }
+ else
+ return "/system/bin/";
+
+ } catch (Exception e) {
+ return BASE_DIR;
+ }
+
+
+ }
public static int setDNSProxying () throws Exception
{
+ String baseDir = findBaseDir();
final StringBuilder log = new StringBuilder();
int code;
- String[] cmds = {CMD_DNS_PROXYING_ADD};
+ String[] cmds = {baseDir + CMD_DNS_PROXYING_ADD};
code = TorServiceUtils.doShellCommand(cmds, log, true, true);
@@ -78,15 +106,21 @@
}
*/
- public static boolean purgeNatIptables() {
+ public static boolean purgeIptables() {
+
+ String baseDir = findBaseDir();
+
+
StringBuilder res = new StringBuilder();
try {
- String[] cmds = {CMD_NAT_FLUSH};
+ String[] cmds = {baseDir + CMD_NAT_FLUSH, baseDir + CMD_FILTER_FLUSH};
int code = TorServiceUtils.doShellCommand(cmds, res, true, true);
if (code != 0) {
Log.w(TAG, "error purging iptables. exit code: " + code + "\n" + res);
return false;
}
+
+
return true;
} catch (Exception e) {
Log.w(TAG,"error purging iptables: " + e);
@@ -96,7 +130,9 @@
public static boolean setTransparentProxyingByApp(Context context, TorifiedApp[] apps, boolean forceAll) throws Exception
{
-
+
+ String baseDir = findBaseDir();
+
String command = null;
command = IPTABLES_ADD; //ADD
@@ -121,30 +157,49 @@
Log.i(TAG,"enabling transproxy for app: " + apps[i].getUsername() + "(" + apps[i].getUid() + ")");
//TCP
+ script.append(baseDir);
script.append("iptables -t nat");
- script.append(command);
- script.append("OUTPUT -p tcp -m owner --uid-owner ");
+ script.append(" -A OUTPUT -p tcp -m owner --uid-owner ");
script.append(apps[i].getUid());
- script.append(" -j DNAT --to 127.0.0.1:9040");
+ // script.append(" -j DNAT --to 127.0.0.1:9040");
+ script.append(" -m tcp --syn -j REDIRECT --to-ports 9040");
script.append(" || exit\n");
//UDP
+ script.append(baseDir);
script.append("iptables -t nat");
- script.append(command);
- script.append("OUTPUT -p udp -m owner --uid-owner ");
+ script.append(" -A OUTPUT -p udp -m owner --uid-owner ");
script.append(apps[i].getUid());
- script.append(" -j DROP"); //drop all UDP packets as Tor won't handle them
+ script.append(" --dport 53 -j REDIRECT --to-ports 5400"); //drop all UDP packets as Tor won't handle them
script.append(" || exit\n");
+
+ script.append(baseDir);
+ script.append("iptables -t nat");
+ script.append(" -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
+ script.append(" || exit\n");
+
+
+ /*
+ * iptables -t nat -A OUTPUT -p tcp -m owner --uid-owner anonymous -m tcp -j REDIRECT --to-ports 9040
+iptables -t nat -A OUTPUT -p udp -m owner --uid-owner anonymous -m udp --dport 53 -j REDIRECT --to-ports 53
+iptables -t filter -A OUTPUT -p tcp -m owner --uid-owner anonymous -m tcp --dport 9040 -j ACCEPT
+iptables -t filter -A OUTPUT -p udp -m owner --uid-owner anonymous -m udp --dport 53 -j ACCEPT
+iptables -t filter -A OUTPUT -m owner --uid-owner anonymous -j DROP
+
+ */
}
}
String[] cmd = {script.toString()};
-
+ Log.i(TAG, cmd[0]);
+
code = TorServiceUtils.doShellCommand(cmd, res, true, true);
String msg = res.toString();
- Log.e(TAG, msg);
+ Log.i(TAG, msg);
return false;
@@ -153,10 +208,9 @@
public static boolean setTransparentProxyingByPort(Context context, String[] ports) {
- String command = null;
+ String baseDir = findBaseDir();
+
- command = IPTABLES_ADD; //ADD
-
final StringBuilder script = new StringBuilder();
try {
@@ -167,6 +221,8 @@
Log.i(TAG,"enabling transproxy for port: " + ports[i]);
//TCP
+
+ script.append(baseDir);
script.append("iptables -t nat");
script.append("-A PREROUTING -p tcp --dport ");
script.append(ports[i]);
@@ -174,6 +230,8 @@
script.append(" || exit\n");
//UDP
+
+ script.append(baseDir);
script.append("iptables -t nat");
script.append("-A PREROUTING -p udp --dport ");
script.append(ports[i]);
@@ -185,7 +243,8 @@
StringBuilder res = new StringBuilder();
String[] cmd = {script.toString()};
-
+ Log.i(TAG, cmd[0]);
+
code = TorServiceUtils.doShellCommand(cmd, res, true, true);
String msg = res.toString();