[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]
[or-cvs] r22677: {projects} modified control port usage, updated startup UI screen, impl (in projects/android/trunk/Orbot: . res/drawable res/layout res/values res/xml src/org/torproject/android src/org/torproject/android/service)
Author: n8fr8
Date: 2010-07-23 11:10:00 +0000 (Fri, 23 Jul 2010)
New Revision: 22677
Modified:
projects/android/trunk/Orbot/AndroidManifest.xml
projects/android/trunk/Orbot/default.properties
projects/android/trunk/Orbot/res/drawable/toroff.png
projects/android/trunk/Orbot/res/drawable/toron.png
projects/android/trunk/Orbot/res/layout/layout_apps_item.xml
projects/android/trunk/Orbot/res/layout/layout_log.xml
projects/android/trunk/Orbot/res/values/strings.xml
projects/android/trunk/Orbot/res/xml/preferences.xml
projects/android/trunk/Orbot/src/org/torproject/android/Orbot.java
projects/android/trunk/Orbot/src/org/torproject/android/SettingsPreferences.java
projects/android/trunk/Orbot/src/org/torproject/android/TorConstants.java
projects/android/trunk/Orbot/src/org/torproject/android/service/ITorService.aidl
projects/android/trunk/Orbot/src/org/torproject/android/service/ITorServiceCallback.aidl
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:
modified control port usage, updated startup UI screen, implemented all-app torification and more
Modified: projects/android/trunk/Orbot/AndroidManifest.xml
===================================================================
--- projects/android/trunk/Orbot/AndroidManifest.xml 2010-07-23 08:58:38 UTC (rev 22676)
+++ projects/android/trunk/Orbot/AndroidManifest.xml 2010-07-23 11:10:00 UTC (rev 22677)
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="org.torproject.android"
- android:versionName="0.2.2.13-orbot-alpha-0.0.8" android:versionCode="2">
+ android:versionName="0.2.2.13-orbot-alpha-0.0.8" android:versionCode="8">
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
Modified: projects/android/trunk/Orbot/default.properties
===================================================================
--- projects/android/trunk/Orbot/default.properties 2010-07-23 08:58:38 UTC (rev 22676)
+++ projects/android/trunk/Orbot/default.properties 2010-07-23 11:10:00 UTC (rev 22677)
@@ -10,5 +10,5 @@
# Indicates whether an apk should be generated for each density.
split.density=false
# Project target.
-target=android-8
+target=android-3
apk-configurations=
Modified: projects/android/trunk/Orbot/res/drawable/toroff.png
===================================================================
(Binary files differ)
Modified: projects/android/trunk/Orbot/res/drawable/toron.png
===================================================================
(Binary files differ)
Modified: projects/android/trunk/Orbot/res/layout/layout_apps_item.xml
===================================================================
--- projects/android/trunk/Orbot/res/layout/layout_apps_item.xml 2010-07-23 08:58:38 UTC (rev 22676)
+++ projects/android/trunk/Orbot/res/layout/layout_apps_item.xml 2010-07-23 11:10:00 UTC (rev 22677)
@@ -4,11 +4,15 @@
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
-<CheckBox android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/itemcheck"></CheckBox>
+
+
<ImageView android:id="@+id/itemicon" android:layout_width="48px" android:layout_height="48px"></ImageView>
-<TextView android:layout_height="wrap_content" android:id="@+id/itemtext" android:text="uid:packages" android:layout_width="wrap_content"
-android:textSize="18sp"></TextView>
+<TextView android:layout_height="wrap_content" android:id="@+id/itemtext" android:text="uid:packages"
+android:layout_width="220px" android:textSize="18sp"></TextView>
+<CheckBox android:layout_width="48px" android:layout_height="48px" android:id="@+id/itemcheck"></CheckBox>
+
+
</LinearLayout>
Modified: projects/android/trunk/Orbot/res/layout/layout_log.xml
===================================================================
--- projects/android/trunk/Orbot/res/layout/layout_log.xml 2010-07-23 08:58:38 UTC (rev 22676)
+++ projects/android/trunk/Orbot/res/layout/layout_log.xml 2010-07-23 11:10:00 UTC (rev 22677)
@@ -1,17 +1,52 @@
<?xml version="1.0" encoding="utf-8"?>
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:orientation="vertical"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent"
+ android:background="@drawable/bgtitanium">
+
+ <RelativeLayout android:id="@+id/layoutHeaderMain"
+ android:layout_width="fill_parent"
+ android:layout_height="30dp"
+ android:layout_gravity="center_horizontal"
+ android:background="#A0909090">
+ <ImageView android:id="@+id/radioModeImage"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="0px"
+ android:layout_marginRight="3px"
+ android:gravity="right"
+ android:layout_toRightOf="@+id/radioModeLabel"
+ android:layout_alignParentRight="true"
+ android:layout_alignParentTop="true"
+ android:src="@drawable/tor25"
+ />
+ <TextView android:id="@+id/radioModeText"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/powered_by"
+ android:layout_marginTop="9px"
+ android:layout_marginRight="0px"
+ android:gravity="right"
+ android:layout_toLeftOf="@+id/radioModeImage"
+ android:textColor="#333333" />
+ </RelativeLayout>
<ScrollView android:orientation="vertical"
android:layout_height="fill_parent"
android:layout_width="fill_parent" android:id="@+id/logScrollView"
xmlns:android="http://schemas.android.com/apk/res/android">
<TextView android:id="@+id/messageLog"
- android:layout_height="fill_parent"
+ android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:layout_x="2px"
android:layout_y="2px"
android:textSize="12px"
+ android:background="#A0222222"
/>
</ScrollView>
+ </LinearLayout>
\ No newline at end of file
Modified: projects/android/trunk/Orbot/res/values/strings.xml
===================================================================
--- projects/android/trunk/Orbot/res/values/strings.xml 2010-07-23 08:58:38 UTC (rev 22676)
+++ projects/android/trunk/Orbot/res/values/strings.xml 2010-07-23 11:10:00 UTC (rev 22677)
@@ -15,7 +15,7 @@
<string name="status_shutting_down">Orbot is shutting down</string>
<string name="tor_process_connecting">Starting Tor...</string>
-<string name="tor_process_connecting_step2">authenticating control connection...</string>
+<string name="tor_process_connecting_step2">Setting up control...</string>
<string name="tor_process_connecting_step3">complete.</string>
<string name="tor_process_connecting_step4">waiting.</string>
@@ -37,7 +37,7 @@
<string name="help_text_1">Orbot requires different configuration depending on the Android operating system version it is used on.
Please visit https://www.torproject.org/docs/android.html for the latest information.</string>
-<string name="help_text_2">For non-rooted Android 1.x devices (G1, MyTouch3G, Hero): Please use the "ProxySurf" browser available in the Android Market, and set
+<string name="help_text_2">For non-rooted Android 1.x devices: Please use the "ProxySurf" browser available in the Android Market, and set
the HTTP Proxy to 127.0.0.1 and port 8118, for HTTP traffic only (HTTP/S will not work).</string>
<string name="help_text_3">For Instant Messaging, try "Beem" in the market, and set the SOCKS5 proxy to 127.0.0.1 / port 9050.</string>
@@ -52,4 +52,16 @@
<string name="menu_exit">Exit</string>
<string name="powered_by">powered by the Tor Project</string>
<string name="press_to_start">- press to start -</string>
+
+<string name="pref_trans_proxy_group">Transparent Proxying (Requires Root)</string>
+<string name="pref_trans_proxy_title">Transparent Proxying</string>
+<string name="pref_trans_proxy_summary">Automatic Torifying of Apps</string>
+
+<string name="pref_transparent_all_title">Tor Everything</string>
+<string name="pref_transparent_all_summary">Send traffic for all apps through Tor</string>
+
+<string name="status_install_success">Tor binaries successfully installed!</string>
+<string name="status_install_fail">The Tor binary files were unable to be installed. Please check the log and notify tor-assistants@xxxxxxxxxxxxxx</string>
+
+<string name="title_error">Application Error</string>
</resources>
Modified: projects/android/trunk/Orbot/res/xml/preferences.xml
===================================================================
--- projects/android/trunk/Orbot/res/xml/preferences.xml 2010-07-23 08:58:38 UTC (rev 22676)
+++ projects/android/trunk/Orbot/res/xml/preferences.xml 2010-07-23 11:10:00 UTC (rev 22677)
@@ -1,20 +1,20 @@
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
-<PreferenceCategory android:title="Transparent Proxying (Requires Root)">
+<PreferenceCategory android:title="@string/pref_trans_proxy_group">
<CheckBoxPreference
android:defaultValue="false"
android:key="pref_transparent"
-android:title="Transparent Proxying"
-android:summary="Auto-Tor Proxying"
+android:title="@string/pref_trans_proxy_title"
+android:summary="@string/pref_trans_proxy_summary"
android:enabled="true"/>
<CheckBoxPreference
android:defaultValue="false"
android:key="pref_transparent_all"
-android:title="Auto-Proxy All Apps"
-android:summary="Route All Traffic Through Tor"
-android:enabled="true"/>
+android:summary="@string/pref_transparent_all_summary"
+android:enabled="true"
+android:title="@string/pref_transparent_all_title"/>
<Preference
android:defaultValue=""
Modified: projects/android/trunk/Orbot/src/org/torproject/android/Orbot.java
===================================================================
--- projects/android/trunk/Orbot/src/org/torproject/android/Orbot.java 2010-07-23 08:58:38 UTC (rev 22676)
+++ projects/android/trunk/Orbot/src/org/torproject/android/Orbot.java 2010-07-23 11:10:00 UTC (rev 22677)
@@ -3,15 +3,11 @@
package org.torproject.android;
-import java.util.Arrays;
-import java.util.Comparator;
import java.util.StringTokenizer;
import org.torproject.android.service.ITorService;
import org.torproject.android.service.ITorServiceCallback;
-import org.torproject.android.service.TorServiceUtils;
import org.torproject.android.service.TorTransProxy;
-import org.torproject.android.service.TorServiceConstants;
import android.app.Activity;
import android.app.AlertDialog;
@@ -36,28 +32,21 @@
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
-import android.view.ViewGroup;
import android.view.View.OnClickListener;
-import android.widget.ArrayAdapter;
+import android.view.animation.Animation;
+import android.view.animation.AnimationUtils;
import android.widget.CheckBox;
-import android.widget.CompoundButton;
import android.widget.ImageView;
-import android.widget.ListAdapter;
-import android.widget.ListView;
import android.widget.TextView;
-import android.widget.Toast;
-import android.widget.CompoundButton.OnCheckedChangeListener;
-public class Orbot extends Activity implements OnClickListener, TorConstants, OnCheckedChangeListener
+public class Orbot extends Activity implements OnClickListener, TorConstants
{
/* Useful UI bits */
private TextView txtMessageLog = null; //the full screen log view of Tor control messages
private TextView lblStatus = null; //the main text display widget
private ImageView imgStatus = null; //the main touchable image for activating Orbot
- private ProgressDialog progressDialog;
- private ListView listApps;
- private boolean showingSettings = false;
+// private ProgressDialog progressDialog;
private MenuItem mItemOnOff = null;
/* Some tracking bits */
@@ -96,7 +85,7 @@
mItem.setIcon(R.drawable.ic_menu_register);
mItem = menu.add(0, 7, Menu.NONE, getString(R.string.menu_verify));
- mItem.setIcon(R.drawable.ic_menu_goto);
+ mItem.setIcon(R.drawable.ic_menu_check);
mItem = menu.add(0,6, Menu.NONE, getString(R.string.menu_log));
mItem.setIcon(R.drawable.ic_menu_reports);
@@ -163,10 +152,6 @@
{
showHelp();
}
- else if (item.getItemId() == 5)
- {
- showApps();
- }
else if (item.getItemId() == 7)
{
//launch check.torproject.org
@@ -257,22 +242,22 @@
protected void onResume() {
super.onResume();
+
NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
mNotificationManager.cancelAll();
- updateStatus (""); //update the status, which checks the service status
- if (showingSettings)
+ if (mService != null)
{
-
- showingSettings = false;
- processSettings();
-
+ try {
+ processSettings();
+ } catch (RemoteException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
}
-
-
}
/* (non-Javadoc)
@@ -285,8 +270,10 @@
startService(new Intent(INTENT_TOR_SERVICE));
bindService ();
- updateStatus ("");
+ //updateStatus ("");
+ hasRoot = TorTransProxy.hasRootAccess();
+
}
@@ -298,8 +285,6 @@
protected void onStop() {
super.onStop();
- TorServiceUtils.saveAppSettings(this);
-
unbindService();
}
@@ -312,23 +297,6 @@
{
bindService(); //connect the UI activity to the remote service
- if (currentView == R.layout.layout_apps)
- {
- if (hasRoot)
- {
-
- TorServiceUtils.saveAppSettings(this);
-
- if (enableTransparentProxy)
- {
- TorTransProxy.purgeNatIptables();
- TorTransProxy.setDNSProxying();
- TorTransProxy.setTransparentProxying(this, TorServiceUtils.getApps(this));
- }
-
-
- }
- }
currentView = R.layout.layout_main;
setContentView(currentView);
@@ -352,62 +320,7 @@
}
- private void loadApps ()
- {
- final TorifiedApp[] apps = TorServiceUtils.getApps(this);
-
- Arrays.sort(apps, new Comparator<TorifiedApp>() {
- public int compare(TorifiedApp o1, TorifiedApp o2) {
- if (o1.isTorified() == o2.isTorified()) return o1.getName().compareTo(o2.getName());
- if (o1.isTorified()) return -1;
- return 1;
- }
- });
-
- final LayoutInflater inflater = getLayoutInflater();
-
- final ListAdapter adapter = new ArrayAdapter<TorifiedApp>(this,R.layout.layout_apps_item,R.id.itemtext,apps) {
- public View getView(int position, View convertView, ViewGroup parent) {
- ListEntry entry;
- if (convertView == null) {
- // Inflate a new view
- convertView = inflater.inflate(R.layout.layout_apps_item, parent, false);
- entry = new ListEntry();
- entry.box = (CheckBox) convertView.findViewById(R.id.itemcheck);
- entry.text = (TextView) convertView.findViewById(R.id.itemtext);
- convertView.setTag(entry);
- entry.box.setOnCheckedChangeListener(Orbot.this);
- } else {
- // Convert an existing view
- entry = (ListEntry) convertView.getTag();
- }
- final TorifiedApp app = apps[position];
-
-
- entry.text.setText(app.getName());
- final CheckBox box = entry.box;
- box.setTag(app);
- box.setChecked(app.isTorified());
- return convertView;
- }
- };
- this.listApps.setAdapter(adapter);
-
- }
- /**
- * Called an application is check/unchecked
- */
- public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
- final TorifiedApp app = (TorifiedApp) buttonView.getTag();
- if (app != null) {
- app.setTorified(isChecked);
- }
-
- TorServiceUtils.saveAppSettings(this);
-
- }
-
private static class ListEntry {
private CheckBox box;
private TextView text;
@@ -424,7 +337,7 @@
versionName.setText(R.string.app_version);
new AlertDialog.Builder(this)
- .setTitle(getString(R.string.menu_info))
+ .setTitle(getString(R.string.button_about))
.setView(view)
.setNeutralButton(getString(R.string.button_help), new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
@@ -451,6 +364,25 @@
StringBuilder msg = new StringBuilder();
msg.append(getString(R.string.help_text_1));
msg.append("\n\n");
+
+ if (hasRoot)
+ {
+ msg.append("Your device is ROOTED. Please enable the 'Transparent Proxying' setting to select which apps to send through Tor.");
+ }
+ else
+ {
+
+ msg.append("Your device is NOT rooted.\n");
+
+ msg.append(getString(R.string.help_text_5));
+
+ msg.append("\n\n");
+
+ msg.append(getString(R.string.not_anonymous_yet));
+ }
+
+ /*
+
msg.append(getString(R.string.help_text_2));
msg.append("\n\n");
msg.append(getString(R.string.help_text_3));
@@ -459,6 +391,7 @@
msg.append("\n\n");
msg.append(getString(R.string.help_text_5));
msg.append("\n\n");
+ */
new AlertDialog.Builder(this)
@@ -478,16 +411,14 @@
.show();
}
- private void showApps ()
+ private void showHelpWizard ()
{
- currentView = R.layout.layout_apps;
- setContentView(currentView);
-
- listApps = (ListView)findViewById(R.id.applistview);
- loadApps();
+ //sshowAlert("Configure",getString(R.string.not_anonymous_yet));
}
+
+
/*
* Show the message log UI
*/
@@ -510,7 +441,7 @@
private void showSettings ()
{
- showingSettings = true;
+
startActivity(new Intent(this, SettingsPreferences.class));
@@ -520,7 +451,8 @@
* Read in the Preferences and write then to the .torrc file
*/
- private void processSettings ()
+ /*
+ private void processSettingsOld ()
{
StringBuffer torrcText = new StringBuffer();
@@ -566,6 +498,7 @@
return;
}
+
torrcText.append("UseBridges 1");
torrcText.append('\n');
@@ -645,7 +578,112 @@
Utils.saveTextFile(TorServiceConstants.TORRC_INSTALL_PATH, torrcText.toString());
}
+ */
+ private void processSettings () throws RemoteException
+ {
+
+
+ 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);
+
+ boolean enableTransparentProxy = prefs.getBoolean(PREF_TRANSPARENT, false);
+
+
+ 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.");
+
+
+ return;
+ }
+
+ mService.updateConfiguration("UseBridges", "1", false);
+
+ if (autoUpdateBridges)
+ {
+ mService.updateConfiguration("UpdateBridgesFromAuthority", "1", false);
+
+ }
+ else
+ {
+ mService.updateConfiguration("UpdateBridgesFromAuthority", "0", false);
+ }
+
+ String bridgeDelim = "\n";
+
+ if (bridgeList.indexOf(",") != -1)
+ {
+ bridgeDelim = ",";
+ }
+
+ StringTokenizer st = new StringTokenizer(bridgeList,bridgeDelim);
+ while (st.hasMoreTokens())
+ {
+
+ mService.updateConfiguration("bridge", st.nextToken(), false);
+
+ }
+ }
+ else
+ {
+ mService.updateConfiguration("UseBridges", "0", false);
+
+ }
+
+ try
+ {
+ if (ReachableAddresses)
+ {
+ String ReachableAddressesPorts =
+ prefs.getString(PREF_REACHABLE_ADDRESSES_PORTS, "*:80,*:443");
+
+ mService.updateConfiguration("ReachableAddresses", ReachableAddressesPorts, false);
+
+ }
+ }
+ 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");
+
+ mService.updateConfiguration("ORPort", ORPort + "", false);
+ mService.updateConfiguration("Nickname", nickname, false);
+ mService.updateConfiguration("ExitPolicy", "reject *:*", false);
+
+ }
+ }
+ catch (Exception e)
+ {
+ showAlert("Uh-oh!","Your relay settings caused an exception!");
+
+ return;
+ }
+
+ mService.saveConfiguration();
+
+ }
+
private void showAlert(String title, String msg)
{
@@ -679,9 +717,14 @@
if (torStatus == STATUS_ON)
{
imgStatus.setImageResource(R.drawable.toron);
-
+ imgStatus.clearAnimation();
+
lblStatus.setText(getString(R.string.status_activated));
+ showHelpWizard ();
+
+
+ /*
if (progressDialog != null)
{
@@ -689,23 +732,28 @@
progressDialog.hide();
progressDialog = null;
- if (!enableTransparentProxy)
- {
- showAlert("Configure",getString(R.string.not_anonymous_yet));
- }
- }
-
- // if (torServiceMsg != null && torServiceMsg.length()>0)
- // Toast.makeText(this, torServiceMsg, Toast.LENGTH_LONG).show();
-
-
+
+ }*/
+
}
else if (torStatus == STATUS_CONNECTING)
{
imgStatus.setImageResource(R.drawable.torstarting);
- lblStatus.setText(getString(R.string.status_starting_up));
+
+ /*
+ if (imgStatus.getAnimation()==null)
+ {
+
+ imgStatus.setAnimation(AnimationUtils.loadAnimation(this, R.anim.starting));
+ imgStatus.getAnimation().setRepeatMode(Animation.INFINITE);
+
+ imgStatus.getAnimation().setRepeatCount(Animation.INFINITE);
+ }*/
+
+
+ /*
if (progressDialog == null)
{
progressDialog = new ProgressDialog(this);
@@ -719,14 +767,18 @@
}
progressDialog.setMessage(torServiceMsg);
-
+ */
+
+ lblStatus.setText(torServiceMsg);
+
+
int idx = torServiceMsg.indexOf("%");
if (idx != -1)
{
String pComp = torServiceMsg.substring(idx-2,idx).trim();
int ipComp = Integer.parseInt(pComp);
- progressDialog.setProgress(ipComp);
+ // progressDialog.setProgress(ipComp);
}
@@ -734,21 +786,16 @@
else if (torStatus == STATUS_OFF)
{
imgStatus.setImageResource(R.drawable.torstopping);
+ imgStatus.clearAnimation();
+
lblStatus.setText(getString(R.string.status_shutting_down));
-
- //if (torServiceMsg != null && torServiceMsg.length()>0)
- //Toast.makeText(this, torServiceMsg, Toast.LENGTH_LONG).show();
-
-
-
+
}
else
{
- //if (torServiceMsg != null && torServiceMsg.length()>0)
- //Toast.makeText(this, torServiceMsg, Toast.LENGTH_LONG).show();
-
+ /*
if (progressDialog != null)
{
@@ -756,8 +803,9 @@
progressDialog.hide();
progressDialog = null;
}
+ */
+ imgStatus.clearAnimation();
-
imgStatus.setImageResource(R.drawable.toroff);
lblStatus.setText(getString(R.string.status_disabled));
@@ -837,31 +885,7 @@
}
- private void doTorSetup (boolean enabled)
- {
- if (enabled)
- {
- processSettings();
-
-
- if (hasRoot && enableTransparentProxy)
- {
-
- TorTransProxy.setDNSProxying();
- TorTransProxy.setTransparentProxying(this,TorServiceUtils.getApps(this));
- }
- }
- else
- {
- if (hasRoot && enableTransparentProxy)
- {
- TorTransProxy.purgeNatIptables();
- //TorRoot.setDNSProxying(false);
- //TorRoot.setTransparentProxying(this,false);
- }
- }
- }
-
+
/**
* This implementation is used to receive callbacks from the remote
* service.
@@ -876,21 +900,30 @@
*/
public void statusChanged(String value) {
- Message msg = mHandler.obtainMessage(BUMP_MSG);
+ Message msg = mHandler.obtainMessage(STATUS_MSG);
msg.getData().putString(HANDLER_TOR_MSG, value);
mHandler.sendMessage(msg);
}
+
+ @Override
+ public void logMessage(String value) throws RemoteException {
+
+ Message msg = mHandler.obtainMessage(LOG_MSG);
+ msg.getData().putString(HANDLER_TOR_MSG, value);
+ mHandler.sendMessage(msg);
+
+ }
};
- private static final int BUMP_MSG = 1;
-
+ private static final int STATUS_MSG = 1;
private static final int ENABLE_TOR_MSG = 2;
private static final int DISABLE_TOR_MSG = 3;
-
+ private static final int LOG_MSG = 4;
+
private Handler mHandler = new Handler() {
public void handleMessage(Message msg) {
switch (msg.what) {
- case BUMP_MSG:
+ case STATUS_MSG:
String torServiceMsg = (String)msg.getData().getString(HANDLER_TOR_MSG);
@@ -899,16 +932,24 @@
if (torServiceMsg.length() > 0 && torServiceMsg.charAt(0)!='>')
- updateStatus(torServiceMsg);
+ updateStatus(torServiceMsg);
break;
+ case LOG_MSG:
+
+ String torLogMsg = (String)msg.getData().getString(HANDLER_TOR_MSG);
+
+ logBuffer.append(torLogMsg);
+ logBuffer.append('\n');
+
+
+ break;
case ENABLE_TOR_MSG:
- doTorSetup(true);
+
break;
case DISABLE_TOR_MSG:
- doTorSetup(false);
break;
default:
@@ -958,7 +999,6 @@
boolean mIsBound = false;
boolean hasRoot = false;
- boolean enableTransparentProxy = false;
private void bindService ()
{
@@ -967,9 +1007,8 @@
mIsBound = true;
- hasRoot = TorTransProxy.hasRootAccess();
-
+
}
private void unbindService ()
Modified: projects/android/trunk/Orbot/src/org/torproject/android/SettingsPreferences.java
===================================================================
--- projects/android/trunk/Orbot/src/org/torproject/android/SettingsPreferences.java 2010-07-23 08:58:38 UTC (rev 22676)
+++ projects/android/trunk/Orbot/src/org/torproject/android/SettingsPreferences.java 2010-07-23 11:10:00 UTC (rev 22677)
@@ -21,12 +21,25 @@
private CheckBoxPreference prefcBTransProxyAll = null;
private Preference prefTransProxyApps = null;
- protected void onCreate(Bundle savedInstanceState) {
+ private boolean hasRoot = false;
+
+ protected void onCreate(Bundle savedInstanceState)
+ {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preferences);
+ hasRoot = TorServiceUtils.hasRoot();
- if (!TorServiceUtils.hasRoot())
+ }
+
+
+
+ @Override
+ protected void onResume() {
+
+ super.onResume();
+
+ if (!hasRoot)
{
getPreferenceScreen().getPreference(0).setEnabled(false);
}
Modified: projects/android/trunk/Orbot/src/org/torproject/android/TorConstants.java
===================================================================
--- projects/android/trunk/Orbot/src/org/torproject/android/TorConstants.java 2010-07-23 08:58:38 UTC (rev 22676)
+++ projects/android/trunk/Orbot/src/org/torproject/android/TorConstants.java 2010-07-23 11:10:00 UTC (rev 22677)
@@ -6,7 +6,11 @@
public interface TorConstants {
public final static String TAG = "Orbot";
+
+ public final static String PREFS_KEY = "OrbotPrefs";
+ public final static String PREFS_KEY_TORIFIED = "PrefTord";
+
public final static int FILE_WRITE_BUFFER_SIZE = 2048;
//path to check Tor against
@@ -23,10 +27,12 @@
public final static String NEWLINE = "\n";
+ /*
public final static String TORRC_DEFAULT =
"SocksPort 9050\nSocksListenAddress 127.0.0.1\nSafeSocks 1\nDNSPort 5400\nLog debug syslog\nDataDirectory /data/data/org.torproject.android/cache\n"
+ "ControlPort 9051\nCookieAuthentication 1\nRelayBandwidthRate 20 KBytes\nRelayBandwidthBurst 20 KBytes\nAutomapHostsOnResolve 1\nTransPort 9040\n";
-
+ */
+
public final static String INTENT_TOR_SERVICE = "org.torproject.android.service.TOR_SERVICE";
public final static String HANDLER_TOR_MSG = "torServiceMsg";
Modified: projects/android/trunk/Orbot/src/org/torproject/android/service/ITorService.aidl
===================================================================
--- projects/android/trunk/Orbot/src/org/torproject/android/service/ITorService.aidl 2010-07-23 08:58:38 UTC (rev 22676)
+++ projects/android/trunk/Orbot/src/org/torproject/android/service/ITorService.aidl 2010-07-23 11:10:00 UTC (rev 22677)
@@ -6,19 +6,40 @@
* an interface for calling on to a remote service
*/
interface ITorService {
+
/**
- * Often you want to allow a service to call back to its clients.
- * This shows how to do so, by registering a callback interface with
- * the service.
+ * This allows Tor service to send messages back to the GUI
*/
void registerCallback(ITorServiceCallback cb);
/**
- * Remove a previously registered callback interface.
+ * Remove registered callback interface.
*/
void unregisterCallback(ITorServiceCallback cb);
+ /**
+ * Get a simple int status value for the state of Tor
+ **/
int getStatus();
+ /**
+ * The profile value is the start/stop state for Tor
+ **/
void setProfile(int profile);
+
+ /**
+ * Set configuration
+ **/
+ boolean updateConfiguration (String name, String value, boolean saveToDisk);
+
+ /**
+ * Set configuration
+ **/
+ boolean saveConfiguration ();
+
+ /**
+ * Get current configuration value from torrc
+ */
+ String getConfiguration (String name);
+
}
Modified: projects/android/trunk/Orbot/src/org/torproject/android/service/ITorServiceCallback.aidl
===================================================================
--- projects/android/trunk/Orbot/src/org/torproject/android/service/ITorServiceCallback.aidl 2010-07-23 08:58:38 UTC (rev 22676)
+++ projects/android/trunk/Orbot/src/org/torproject/android/service/ITorServiceCallback.aidl 2010-07-23 11:10:00 UTC (rev 22677)
@@ -7,7 +7,13 @@
*/
oneway interface ITorServiceCallback {
/**
- * Called when the service has a new value for you.
+ * Called when the service has a something to display to the user
*/
void statusChanged(String value);
+
+ /**
+ * Called when the service has something to add to the log
+ */
+ void logMessage(String value);
+
}
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-23 08:58:38 UTC (rev 22676)
+++ projects/android/trunk/Orbot/src/org/torproject/android/service/TorService.java 2010-07-23 11:10:00 UTC (rev 22677)
@@ -15,25 +15,28 @@
import net.freehaven.tor.control.EventHandler;
import net.freehaven.tor.control.TorControlConnection;
+import org.torproject.android.AppManager;
import org.torproject.android.Orbot;
import org.torproject.android.R;
+import android.app.AlertDialog;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
+import android.content.SharedPreferences;
import android.os.IBinder;
import android.os.RemoteCallbackList;
import android.os.RemoteException;
+import android.preference.PreferenceManager;
import android.util.Log;
public class TorService extends Service implements TorServiceConstants, Runnable, EventHandler
{
-
private static int currentStatus = STATUS_READY;
private TorControlConnection conn = null;
@@ -44,7 +47,10 @@
private static final int MAX_START_TRIES = 3;
-
+ private ArrayList<String> configBuffer = null;
+
+ private boolean hasRoot = false;
+
/** Called when the activity is first created. */
public void onCreate() {
super.onCreate();
@@ -57,6 +63,7 @@
_torInstance = this;
+ hasRoot = TorServiceUtils.hasRoot();
}
@@ -130,19 +137,19 @@
}
- private void showToolbarNotification (String title, String notifyMsg, int icon)
+ private void showToolbarNotification (String notifyMsg, int icon)
{
NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
- CharSequence tickerText = title;
+ CharSequence tickerText = notifyMsg;
long when = System.currentTimeMillis();
Notification notification = new Notification(icon, tickerText, when);
Context context = getApplicationContext();
- CharSequence contentTitle = title;
+ CharSequence contentTitle = getString(R.string.app_name);
CharSequence contentText = notifyMsg;
Intent notificationIntent = new Intent(this, Orbot.class);
@@ -189,7 +196,7 @@
catch (Exception e)
{
currentStatus = STATUS_OFF;
- this.showToolbarNotification("Orbot", "Unable to start Tor", R.drawable.tornotification);
+ this.showToolbarNotification(getString(R.string.status_disabled), R.drawable.tornotification);
Log.i(TAG,"Unable to start Tor: " + e.getMessage(),e);
}
}
@@ -220,9 +227,11 @@
currentStatus = STATUS_READY;
- showToolbarNotification ("Orbot","Tor is disabled",R.drawable.tornotificationoff);
- sendCallbackMessage("Tor is disabled");
+
+ showToolbarNotification (getString(R.string.status_disabled),R.drawable.tornotificationoff);
+ sendCallbackMessage(getString(R.string.status_disabled));
+ setupTransProxy(false);
}
@@ -254,7 +263,8 @@
if (conn != null)
{
try {
- Log.i(TAG,"sending SHUTDOWN signal");
+ logNotice("sending SHUTDOWN signal to Tor process");
+ // conn.shutdownTor(arg0)
conn.signal("SHUTDOWN");
} catch (Exception e) {
Log.i(TAG,"error shutting down Tor via connection",e);
@@ -269,7 +279,7 @@
while (procId != -1)
{
- Log.i(TAG,"Found Tor PID=" + procId + " - killing now...");
+ logNotice("Found Tor PID=" + procId + " - killing now...");
String[] cmd = { SHELL_CMD_KILL + ' ' + procId + "" };
TorServiceUtils.doShellCommand(cmd,log, false, false);
@@ -290,22 +300,6 @@
procId = TorServiceUtils.findProcessId(TorServiceConstants.PRIVOXY_INSTALL_PATH);
}
- /*
- //removing this for now
- if (_webProxy != null)
- {
- try
- {
- //shutdown web proxy
- _webProxy.stop();
- _webProxy = null;
- }
- catch (Exception e)
- {
- Log.i(TAG,"error stopping web proxy",e);
- }
- }*/
-
}
private void logNotice (String msg)
@@ -335,17 +329,17 @@
if (torBinaryExists && privoxyBinaryExists)
{
- logNotice("Tor, Privoxy, IPtables binaries installed!");
+ logNotice(getString(R.string.status_install_success));
- this.showToolbarNotification("Orbot Installed!", "Tor was successfully extracted and installed", R.drawable.tornotification);
+ showToolbarNotification(getString(R.string.status_install_success), R.drawable.tornotification);
}
else
{
- logNotice("Binary install FAILED!");
-
- this.showToolbarNotification("Orbot FAIL!", "The binaries were unable to be installed", R.drawable.tornotification);
+
+ logNotice(getString(R.string.status_install_fail));
+ showAlert(getString(R.string.title_error),getString(R.string.status_install_fail));
return false;
}
@@ -354,11 +348,11 @@
StringBuilder log = new StringBuilder ();
- Log.i(TAG,"Setting permission on Tor binary");
+ logNotice("Setting permission on Tor binary");
String[] cmd1 = {SHELL_CMD_CHMOD + ' ' + CHMOD_EXE_VALUE + ' ' + TOR_BINARY_INSTALL_PATH};
TorServiceUtils.doShellCommand(cmd1, log, false, true);
- Log.i(TAG,"Setting permission on Privoxy binary");
+ logNotice("Setting permission on Privoxy binary");
String[] cmd2 = {SHELL_CMD_CHMOD + ' ' + CHMOD_EXE_VALUE + ' ' + PRIVOXY_INSTALL_PATH};
TorServiceUtils.doShellCommand(cmd2, log, false, true);
@@ -367,18 +361,20 @@
public void initTor () throws Exception
{
-
+ // android.os.Debug.waitForDebugger();
+
currentStatus = STATUS_CONNECTING;
- logNotice("Tor is starting up...");
- this.sendCallbackMessage("starting...");
+ logNotice(getString(R.string.status_starting_up));
+ sendCallbackMessage(getString(R.string.status_starting_up));
+
killTorProcess ();
checkTorBinaries ();
+
+
-
-
new Thread()
{
public void run ()
@@ -401,6 +397,8 @@
{
try {
runTorShellCmd();
+
+ setupTransProxy(true);
} catch (Exception e) {
Log.i(TAG,"Unable to start Tor: " + e.getMessage(),e);
@@ -440,7 +438,7 @@
{
sendCallbackMessage("Couldn't start Tor process...\n" + log.toString());
Thread.sleep(1000);
- sendCallbackMessage("Trying to start Tor again...\n" + log.toString());
+ sendCallbackMessage(getString(R.string.status_starting_up));
Thread.sleep(3000);
attempts++;
}
@@ -457,7 +455,7 @@
logNotice("Tor process id=" + procId);
- showToolbarNotification("Orbot starting...", "Tor is running", R.drawable.tornotification);
+ showToolbarNotification(getString(R.string.status_starting_up), R.drawable.tornotification);
initControlConnection ();
}
@@ -489,7 +487,7 @@
if (privoxyProcId == -1)
{
- this.sendCallbackMessage("Couldn't start Privoxy process... retrying...\n" + log);
+ logNotice("Couldn't start Privoxy process... retrying...\n" + log);
Thread.sleep(3000);
attempts++;
}
@@ -506,18 +504,16 @@
}
-
-
-
+ /*
public String generateHashPassword ()
{
- /*
+
PasswordDigest d = PasswordDigest.generateDigest();
byte[] s = d.getSecret(); // pass this to authenticate
String h = d.getHashedPassword(); // pass this to the Tor on startup.
-*/
+
return null;
- }
+ }*/
public void initControlConnection () throws Exception, RuntimeException
{
@@ -534,7 +530,7 @@
conn = TorControlConnection.getConnection(s);
// conn.authenticate(new byte[0]); // See section 3.2
- sendCallbackMessage(baseMessage + ' ' + getString(R.string.tor_process_connecting_step2));
+ sendCallbackMessage(getString(R.string.tor_process_connecting_step2));
Log.i(TAG,"SUCCESS connected to control port");
@@ -542,13 +538,20 @@
byte[] cookie = new byte[(int)fileCookie.length()];
new FileInputStream(new File(TOR_CONTROL_AUTH_COOKIE)).read(cookie);
conn.authenticate(cookie);
-
+
Log.i(TAG,"SUCCESS authenticated to control port");
- sendCallbackMessage(baseMessage + ' ' + getString(R.string.tor_process_connecting_step3));
+ sendCallbackMessage(getString(R.string.tor_process_connecting_step2) + getString(R.string.tor_process_connecting_step3));
addEventHandler();
+ if (configBuffer != null)
+ {
+ conn.setConf(configBuffer);
+ //conn.saveConf();
+ configBuffer = null;
+ }
+
break; //don't need to retry
}
catch (Exception ce)
@@ -568,29 +571,6 @@
}
- public void modifyConf () throws IOException
- {
- // Get one configuration variable.
- List<ConfigEntry> options = conn.getConf("contact");
- options.size();
- // Get a set of configuration variables.
- // List options = conn.getConf(Arrays.asList(new String[]{
- // "contact", "orport", "socksport"}));
- // Change a single configuration variable
- conn.setConf("BandwidthRate", "1 MB");
- // Change several configuration variables
- conn.setConf(Arrays.asList(new String[]{
- "HiddenServiceDir /home/tor/service1",
- "HiddenServicePort 80",
- }));
- // Reset some variables to their defaults
- conn.resetConf(Arrays.asList(new String[]{
- "contact", "socksport"
- }));
- // Flush the configuration to disk.
- conn.saveConf();
-
- }
/*
private void getTorStatus () throws IOException
@@ -640,7 +620,7 @@
conn.setEventHandler(this);
conn.setEvents(Arrays.asList(new String[]{
- "ORCONN", "CIRC", "NOTICE", "ERR"}));
+ "ORCONN", "CIRC", "NOTICE", "WARN", "ERR"}));
// conn.setEvents(Arrays.asList(new String[]{
// "DEBUG", "INFO", "NOTICE", "WARN", "ERR"}));
@@ -701,7 +681,7 @@
if (msg.indexOf(TOR_CONTROL_PORT_MSG_BOOTSTRAP_DONE)!=-1)
{
currentStatus = STATUS_ON;
- showToolbarNotification ("Orbot","Tor is enabled",R.drawable.tornotification);
+ showToolbarNotification (getString(R.string.status_activated),R.drawable.tornotification);
}
@@ -709,6 +689,15 @@
}
+ private void showAlert(String title, String msg)
+ {
+
+ new AlertDialog.Builder(this)
+ .setTitle(title)
+ .setMessage(msg)
+ .setPositiveButton(android.R.string.ok, null)
+ .show();
+ }
public void newDescriptors(List<String> orList) {
@@ -783,6 +772,8 @@
}
+ private Intent launchContext = null;
+
public IBinder onBind(Intent intent) {
// Select the interface to return. If your service only implements
// a single interface, you can just return it here without checking
@@ -807,6 +798,7 @@
* The IRemoteInterface is defined through IDL
*/
private final ITorService.Stub mBinder = new ITorService.Stub() {
+
public void registerCallback(ITorServiceCallback cb) {
if (cb != null) mCallbacks.register(cb);
}
@@ -820,10 +812,103 @@
public void setProfile (int profile)
{
setTorProfile(profile);
- sendCallbackMessage("");
}
+ public String getConfiguration (String name)
+ {
+ try
+ {
+ if (conn != null)
+ {
+ StringBuffer result = new StringBuffer();
+
+ List<ConfigEntry> listCe = conn.getConf(name);
+
+ Iterator<ConfigEntry> itCe = listCe.iterator();
+ ConfigEntry ce = null;
+
+ while (itCe.hasNext())
+ {
+ ce = itCe.next();
+
+ result.append(ce.key);
+ result.append(' ');
+ result.append(ce.value);
+ result.append('\n');
+ }
+
+ return result.toString();
+ }
+ }
+ catch (IOException ioe)
+ {
+ Log.e(TAG, "Unable to update Tor configuration", ioe);
+ logNotice("Unable to update Tor configuration: " + ioe.getMessage());
+ }
+
+ return null;
+ }
+ /**
+ * Set configuration
+ **/
+ public boolean updateConfiguration (String name, String value, boolean saveToDisk)
+ {
+ try
+ {
+ if (conn != null)
+ {
+ conn.setConf(name, value);
+
+ if (saveToDisk)
+ {
+ // Flush the configuration to disk.
+ //conn.saveConf(); //NF 22/07/10 this is crashing right now
+ }
+
+ return true;
+ }
+ else
+ {
+ if (configBuffer == null)
+ configBuffer = new ArrayList<String>();
+
+ configBuffer.add(name + ' ' + value);
+ }
+ }
+ catch (IOException ioe)
+ {
+ Log.e(TAG, "Unable to update Tor configuration", ioe);
+ logNotice("Unable to update Tor configuration: " + ioe.getMessage());
+ }
+
+ return false;
+ }
+
+ public boolean saveConfiguration ()
+ {
+ try
+ {
+ if (conn != null)
+ {
+
+
+ // Flush the configuration to disk.
+ //this is doing bad things right now NF 22/07/10
+ //conn.saveConf();
+
+ return true;
+ }
+ }
+ catch (Exception ioe)
+ {
+ Log.e(TAG, "Unable to update Tor configuration", ioe);
+ logNotice("Unable to update Tor configuration: " + ioe.getMessage());
+ }
+
+ return false;
+
+ }
};
private ArrayList<String> callbackBuffer = new ArrayList<String>();
@@ -864,4 +949,40 @@
mCallbacks.finishBroadcast();
}
+
+ private void setupTransProxy (boolean enabled)
+ {
+
+ SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
+
+ boolean enableTransparentProxy = prefs.getBoolean("pref_transparent", false);
+ boolean transProxyAll = prefs.getBoolean("pref_transparent_all", false);
+
+ logNotice ("Transparent Proxying: " + enableTransparentProxy);
+
+ if (enabled)
+ {
+
+
+ if (hasRoot && enableTransparentProxy)
+ {
+
+ TorTransProxy.setDNSProxying();
+ TorTransProxy.setTransparentProxyingByApp(this,AppManager.getApps(this),transProxyAll);
+
+ }
+ else
+ {
+ TorTransProxy.purgeNatIptables();
+
+ }
+ }
+ else
+ {
+ if (hasRoot)
+ {
+ TorTransProxy.purgeNatIptables();
+ }
+ }
+ }
}
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-23 08:58:38 UTC (rev 22676)
+++ projects/android/trunk/Orbot/src/org/torproject/android/service/TorServiceConstants.java 2010-07-23 11:10:00 UTC (rev 22677)
@@ -6,10 +6,12 @@
public final static String TAG = "TOR_SERVICE";
+ public final static String TOR_APP_USERNAME = "org.torproject.android";
+
//home directory of Android application
- public final static String TOR_HOME = "/data/data/org.torproject.android/";
+ public final static String TOR_HOME = "/data/data/" + TOR_APP_USERNAME + "/";
- public final static String TOR_HOME_DATA_DIR = TOR_HOME + "cache/";
+ 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";
Modified: projects/android/trunk/Orbot/src/org/torproject/android/service/TorServiceUtils.java
===================================================================
--- projects/android/trunk/Orbot/src/org/torproject/android/service/TorServiceUtils.java 2010-07-23 08:58:38 UTC (rev 22676)
+++ projects/android/trunk/Orbot/src/org/torproject/android/service/TorServiceUtils.java 2010-07-23 11:10:00 UTC (rev 22677)
@@ -21,95 +21,11 @@
public class TorServiceUtils implements TorServiceConstants {
- private static TorifiedApp[] apps = null;
private final static String PREFS_KEY = "OrbotPrefs";
private final static String PREFS_KEY_TORIFIED = "PrefTord";
- public static void saveAppSettings (Context context)
- {
- if (apps == null)
- return;
-
- final SharedPreferences prefs = context.getSharedPreferences(PREFS_KEY, 0);
-
- StringBuilder tordApps = new StringBuilder();
-
- for (int i = 0; i < apps.length; i++)
- {
- if (apps[i].isTorified())
- {
- tordApps.append(apps[i].getUsername());
- tordApps.append("|");
- }
- }
-
- Editor edit = prefs.edit();
- edit.putString(PREFS_KEY_TORIFIED, tordApps.toString());
- edit.commit();
-
- }
- public static TorifiedApp[] getApps (Context context)
- {
- if (apps != null)
- return apps;
-
- final SharedPreferences prefs = context.getSharedPreferences(PREFS_KEY, 0);
-
- String tordAppString = prefs.getString(PREFS_KEY_TORIFIED, "");
- String[] tordApps;
-
- StringTokenizer st = new StringTokenizer(tordAppString,"|");
- tordApps = new String[st.countTokens()];
- int tordIdx = 0;
- while (st.hasMoreTokens())
- {
- tordApps[tordIdx++] = st.nextToken();
- }
-
- Arrays.sort(tordApps);
-
- //else load the apps up
- PackageManager pMgr = context.getPackageManager();
-
- List<ApplicationInfo> lAppInfo = pMgr.getInstalledApplications(0);
-
- Iterator<ApplicationInfo> itAppInfo = lAppInfo.iterator();
-
- apps = new TorifiedApp[lAppInfo.size()];
-
- ApplicationInfo aInfo = null;
-
- int appIdx = 0;
-
- while (itAppInfo.hasNext())
- {
- aInfo = itAppInfo.next();
-
- apps[appIdx] = new TorifiedApp();
-
- apps[appIdx].setEnabled(aInfo.enabled);
- apps[appIdx].setUid(aInfo.uid);
- apps[appIdx].setUsername(pMgr.getNameForUid(apps[appIdx].getUid()));
- apps[appIdx].setProcname(aInfo.processName);
- apps[appIdx].setName(pMgr.getApplicationLabel(aInfo).toString());
-
- // check if this application is allowed
- if (Arrays.binarySearch(tordApps, apps[appIdx].getUsername()) >= 0) {
- apps[appIdx].setTorified(true);
- }
- else
- {
- apps[appIdx].setTorified(false);
- }
-
- appIdx++;
- }
-
- return apps;
- }
-
public static int findProcessId(String command)
{
int procId = -1;
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-23 08:58:38 UTC (rev 22676)
+++ projects/android/trunk/Orbot/src/org/torproject/android/service/TorTransProxy.java 2010-07-23 11:10:00 UTC (rev 22677)
@@ -93,7 +93,7 @@
}
}
- public static boolean setTransparentProxying(Context context, TorifiedApp[] apps) {
+ public static boolean setTransparentProxyingByApp(Context context, TorifiedApp[] apps, boolean forceAll) {
String command = null;
@@ -101,14 +101,24 @@
final StringBuilder script = new StringBuilder();
+ StringBuilder res = new StringBuilder();
+ int code = -1;
+
try {
- int code;
+
for (int i = 0; i < apps.length; i++)
{
-
- if (apps[i].isTorified())
+ if (forceAll || apps[i].isTorified())
{
+
+ if (apps[i].getUsername().equals(TorServiceConstants.TOR_APP_USERNAME))
+ {
+ Log.i(TAG,"detected Orbot app - will not transproxy");
+
+ continue;
+ }
+
Log.i(TAG,"enabling transproxy for app: " + apps[i].getUsername() + "(" + apps[i].getUid() + ")");
//TCP
@@ -129,17 +139,16 @@
}
}
- StringBuilder res = new StringBuilder();
String[] cmd = {script.toString()};
code = TorServiceUtils.doShellCommand(cmd, res, true, true);
- String msg = res.toString();
- Log.e(TAG, msg);
+ String msg = res.toString();
+ Log.e(TAG, msg);
} catch (Exception e) {
- Log.w(TAG, "error refreshing iptables: " + e);
+ Log.w(TAG, "error refreshing iptables: err=" + code + "; resp=" + res.toString(), e);
}
return false;
}