This commit is contained in:
Jordan 2014-09-01 19:27:17 -07:00
commit 1229da66cb
14 changed files with 412 additions and 297 deletions

View File

@ -1,8 +1,8 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" <manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="org.torproject.android" package="org.torproject.android"
android:versionName="14.0.6" android:versionName="14.0.7.2"
android:versionCode="118" android:versionCode="121"
android:installLocation="auto" android:installLocation="auto"
> >

View File

@ -1,5 +1,32 @@
NOTE: Specific #s below correspond to Trac tickets logged and maintained at https://trac.torproject.org/projects/tor/ NOTE: Specific #s below correspond to Trac tickets logged and maintained at https://trac.torproject.org/projects/tor/
d2c71d7 update to 14.0.7.2
6e65469 ensure settings are updated and binary paths are on service restart
af433d3 remove unused variables/patterns
b76be6d disable stdout log by default and enable daemon mode
dafd295 simplify process reconnect and transproxy setup - on reconnect to service, don't require call to getInfo before STATUS_ON is s
390b89e remove debug file logging for now until we can improve it
e53e03a tuning Orbot app conflict checker code
c2672cc update to 14.0.7.1
eaccf77 don't call handle intents twice!
24a3db8 update to 14.0.7
add04f2 exit menu option should be a menu
186e74b add new transproxy flush pref and strings
c78a822 add transproxy flush option to settings
68495c3 make delete iptables rules process match add for specific behavior no more drop all output tables, etc
25bc4c0 add new flush transproxy interface method
79a32e6 make sure control connection is not null on rebind - also tune app conflict checker code for Samsung Link
b307d51 make default SOCKs port auto, and THEN try to set specified port - also remove exit IP lookup loop bad code
9cc5f98 don't obfuscate class names; we just need to remove unused classes
3698e46 create new thread for connecting to existing process don't rely on executor yet, as we need it to happen fast
ea37b44 create new thread to just for existing process dont' rely on executor there yet
3a82421 no need for asynctask - just grab the status directly
e2f4f5f don't make these final, because the user might change them
7d243af update changelog
56dfff0 bumped to 14.0.6
05dd331 update to latest jtorctl with patches for thread, error handling 05dd331 update to latest jtorctl with patches for thread, error handling
73d4297 bump to 14.0.5.4 73d4297 bump to 14.0.5.4

View File

@ -2,6 +2,7 @@
-dontusemixedcaseclassnames -dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses -dontskipnonpubliclibraryclasses
-dontpreverify -dontpreverify
-dontobfuscate
-verbose -verbose
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/* -optimizations !code/simplification/arithmetic,!field/*,!class/merging/*

View File

@ -69,7 +69,7 @@
<item android:id="@+id/menu_exit" <item android:id="@+id/menu_exit"
android:title="@string/menu_exit" android:title="@string/menu_exit"
android:icon="@drawable/ic_menu_exit" android:icon="@drawable/ic_menu_exit"
yourapp:showAsAction="ifRoom" yourapp:showAsAction="never"
/> />

View File

@ -1,4 +1,5 @@
Log notice stdout RunAsDaemon 1
AvoidDiskWrites 1
ControlPort auto ControlPort auto
SOCKSPort 0 SOCKSPort 0
DNSPort 0 DNSPort 0

View File

@ -295,4 +295,7 @@
<string name="pref_transproxy_refresh_title">Transproxy Auto-Refresh</string> <string name="pref_transproxy_refresh_title">Transproxy Auto-Refresh</string>
<string name="pref_transproxy_refresh_summary">Re-apply Transproxy rules when the network state changes</string> <string name="pref_transproxy_refresh_summary">Re-apply Transproxy rules when the network state changes</string>
<string name="pref_transproxy_flush_title">Transproxy FORCE REMOVE</string>
<string name="pref_transproxy_flush_summary">Tap here to flush all transproxy network rules NOW</string>
</resources> </resources>

View File

@ -263,6 +263,11 @@ android:summary="@string/pref_transproxy_refresh_summary"
android:enabled="true" android:enabled="true"
android:title="@string/pref_transproxy_refresh_title"/> android:title="@string/pref_transproxy_refresh_title"/>
<Preference
android:key="pref_transproxy_flush"
android:summary="@string/pref_transproxy_flush_summary"
android:enabled="true"
android:title="@string/pref_transproxy_flush_title"/>
<!-- <!--
<CheckBoxPreference <CheckBoxPreference

View File

@ -32,7 +32,6 @@ import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException; import android.content.pm.PackageManager.NameNotFoundException;
import android.content.res.Configuration; import android.content.res.Configuration;
import android.net.Uri; import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle; import android.os.Bundle;
import android.os.Handler; import android.os.Handler;
import android.os.IBinder; import android.os.IBinder;
@ -297,18 +296,22 @@ public class Orbot extends ActionBarActivity implements TorConstants, OnLongClic
{ {
SharedPreferences sprefs = TorServiceUtils.getSharedPrefs(getApplicationContext()); SharedPreferences sprefs = TorServiceUtils.getSharedPrefs(getApplicationContext());
boolean showAppConflict = sprefs.getBoolean("pref_show_conflict",true); boolean showAppConflict = true;//sprefs.getBoolean("pref_show_conflict",true);
String[] badApps = {"com.sec.msc.nts.android.proxy"}; String[] badApps = {"com.sec.msc.nts.android.proxy:com.sec.msc.nts.android.proxy","com.sec.pcw:Samsung Link"};
for (String badApp : badApps) for (String badApp : badApps)
{ {
if (appInstalledOrNot(badApp)) String[] badAppParts = badApp.split(":");
if (appInstalledOrNot(badAppParts[0]))
{ {
String msg = getString(R.string.please_disable_this_app_in_android_settings_apps_if_you_are_having_problems_with_orbot_) + badAppParts[1];
if (showAppConflict) if (showAppConflict)
showAlert(getString(R.string.app_conflict),getString(R.string.please_disable_this_app_in_android_settings_apps_if_you_are_having_problems_with_orbot_) + badApp,true); showAlert(getString(R.string.app_conflict),msg,true);
appendLogTextAndScroll(getString(R.string.please_disable_this_app_in_android_settings_apps_if_you_are_having_problems_with_orbot_) + badApp); appendLogTextAndScroll(msg);
} }
} }
@ -423,19 +426,7 @@ public class Orbot extends ActionBarActivity implements TorConstants, OnLongClic
//terminology but also making sure there are clear distinctions in control //terminology but also making sure there are clear distinctions in control
stopTor(); stopTor();
if (mConnection != null) onDestroy();
unbindService(mConnection);
//perhaps this should be referenced as INTENT_TOR_SERVICE as in startService
stopService(new Intent(this,TorService.class));
//clears all notifications from the status bar
NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
mNotificationManager.cancelAll();
mConnection = null;
mService = null;
} catch (RemoteException e) { } catch (RemoteException e) {
Log.w(TAG, e); Log.w(TAG, e);
@ -648,6 +639,8 @@ public class Orbot extends ActionBarActivity implements TorConstants, OnLongClic
} }
setIntent(null);
updateStatus (""); updateStatus ("");
} }
@ -749,7 +742,7 @@ public class Orbot extends ActionBarActivity implements TorConstants, OnLongClic
PackageManager pm = getPackageManager(); PackageManager pm = getPackageManager();
try try
{ {
PackageInfo pi = pm.getPackageInfo(uri, PackageManager.GET_ACTIVITIES); PackageInfo pi = pm.getPackageInfo(uri, PackageManager.GET_ACTIVITIES);
return pi.applicationInfo.enabled; return pi.applicationInfo.enabled;
} }
catch (PackageManager.NameNotFoundException e) catch (PackageManager.NameNotFoundException e)
@ -769,11 +762,51 @@ public class Orbot extends ActionBarActivity implements TorConstants, OnLongClic
@Override @Override
protected void onActivityResult(int request, int response, Intent data) {
super.onActivityResult(request, response, data);
if (request == 1 && response == RESULT_OK)
{
if (data != null && data.getBooleanExtra("transproxywipe", false))
{
try {
boolean result = mService.flushTransProxy();
if (result)
{
Toast.makeText(this, "Transparent proxy rules flushed!", Toast.LENGTH_SHORT).show();
}
else
{
Toast.makeText(this, "You do not have ROOT access enabled", Toast.LENGTH_SHORT).show();
}
} catch (RemoteException e) {
e.printStackTrace();
}
}
}
}
@Override
protected void onResume() { protected void onResume() {
super.onResume(); super.onResume();
if (mService != null) setLocale();
if (mService == null)
{
startService();
}
else
{ {
try { try {
@ -782,17 +815,16 @@ public class Orbot extends ActionBarActivity implements TorConstants, OnLongClic
if (torStatus != TorServiceConstants.STATUS_ON) if (torStatus != TorServiceConstants.STATUS_ON)
mService.processSettings(); mService.processSettings();
setLocale();
handleIntents(); handleIntents();
} catch (RemoteException e) { } catch (RemoteException e) {
// TODO Auto-generated catch block // TODO Auto-generated catch block
e.printStackTrace(); e.printStackTrace();
} }
}
updateStatus(""); updateStatus("");
}
} }
AlertDialog aDialog = null; AlertDialog aDialog = null;
@ -831,131 +863,94 @@ public class Orbot extends ActionBarActivity implements TorConstants, OnLongClic
aDialog.setCanceledOnTouchOutside(true); aDialog.setCanceledOnTouchOutside(true);
} }
/* private void updateStatus (String torServiceMsg)
* Set the state of the running/not running graphic and label
* this all needs to be looked at w/ the shift to progressDialog
*/
public void updateStatus (String torServiceMsg)
{ {
new updateStatusAsync().execute(torServiceMsg);
}
private class updateStatusAsync extends AsyncTask<String, Void, Integer> {
String mTorServiceMsg = null;
@Override
protected Integer doInBackground(String... params) {
mTorServiceMsg = params[0];
int newTorStatus = TorServiceConstants.STATUS_OFF;
try
{
if (mService != null)
return new Integer(mService.getStatus());
}
catch (Exception e)
{
//error
Log.d(TAG,"error in update status",e);
}
return newTorStatus;
}
@Override int newTorStatus = torStatus;
protected void onPostExecute(Integer result) {
if (mService != null)
updateUI(result.intValue()); try {newTorStatus = mService.getStatus();}
catch (RemoteException e){}
super.onPostExecute(result);
} //now update the layout_main UI based on the status
if (imgStatus != null)
private void updateUI (int newTorStatus) {
{
if (newTorStatus == TorServiceConstants.STATUS_ON)
//now update the layout_main UI based on the status
if (imgStatus != null)
{ {
if (newTorStatus == TorServiceConstants.STATUS_ON)
{
imgStatus.setImageResource(R.drawable.toron);
String lblMsg = getString(R.string.status_activated);
lblStatus.setText(lblMsg);
if (mItemOnOff != null)
mItemOnOff.setTitle(R.string.menu_stop);
if (mTorServiceMsg != null && mTorServiceMsg.length() > 0)
{
appendLogTextAndScroll(mTorServiceMsg);
}
boolean showFirstTime = mPrefs.getBoolean("connect_first_time",true);
if (showFirstTime)
{
Editor pEdit = mPrefs.edit();
pEdit.putBoolean("connect_first_time",false);
pEdit.commit();
showAlert(getString(R.string.status_activated),getString(R.string.connect_first_time),true);
}
if (autoStartFromIntent)
{
setResult(RESULT_OK);
finish();
}
}
else if (newTorStatus == TorServiceConstants.STATUS_CONNECTING)
{
imgStatus.setImageResource(R.drawable.torstarting);
if (mItemOnOff != null)
mItemOnOff.setTitle(R.string.menu_stop);
imgStatus.setImageResource(R.drawable.toron);
if (lblStatus != null && mTorServiceMsg != null)
if (mTorServiceMsg.indexOf('%')!=-1) String lblMsg = getString(R.string.status_activated);
lblStatus.setText(mTorServiceMsg); lblStatus.setText(lblMsg);
appendLogTextAndScroll(mTorServiceMsg);
}
else if (newTorStatus == TorServiceConstants.STATUS_OFF)
{
imgStatus.setImageResource(R.drawable.toroff);
lblStatus.setText(getString(R.string.status_disabled) + "\n" + getString(R.string.press_to_start));
if (mItemOnOff != null)
mItemOnOff.setTitle(R.string.menu_start);
}
}
torStatus = newTorStatus; if (mItemOnOff != null)
mItemOnOff.setTitle(R.string.menu_stop);
}
if (torServiceMsg != null && torServiceMsg.length() > 0)
{
appendLogTextAndScroll(torServiceMsg);
}
boolean showFirstTime = mPrefs.getBoolean("connect_first_time",true);
if (showFirstTime)
{
Editor pEdit = mPrefs.edit();
pEdit.putBoolean("connect_first_time",false);
pEdit.commit();
showAlert(getString(R.string.status_activated),getString(R.string.connect_first_time),true);
}
if (autoStartFromIntent)
{
setResult(RESULT_OK);
finish();
}
}
else if (newTorStatus == TorServiceConstants.STATUS_CONNECTING)
{
imgStatus.setImageResource(R.drawable.torstarting);
if (mItemOnOff != null)
mItemOnOff.setTitle(R.string.menu_stop);
if (lblStatus != null && torServiceMsg != null)
if (torServiceMsg.indexOf('%')!=-1)
lblStatus.setText(torServiceMsg);
appendLogTextAndScroll(torServiceMsg);
}
else if (newTorStatus == TorServiceConstants.STATUS_OFF)
{
imgStatus.setImageResource(R.drawable.toroff);
lblStatus.setText(getString(R.string.status_disabled) + "\n" + getString(R.string.press_to_start));
if (mItemOnOff != null)
mItemOnOff.setTitle(R.string.menu_start);
}
}
torStatus = newTorStatus;
}
}
// guess what? this start's Tor! actually no it just requests via the local ITorService to the remote TorService instance // guess what? this start's Tor! actually no it just requests via the local ITorService to the remote TorService instance
// to start Tor // to start Tor
@ -1181,7 +1176,7 @@ public class Orbot extends ActionBarActivity implements TorConstants, OnLongClic
// we should use this to activity monitor unbind so that we don't have to call // we should use this to activity monitor unbind so that we don't have to call
// bindService() a million times // bindService() a million times
private ServiceConnection mConnection = new ServiceConnection() { private final ServiceConnection mConnection = new ServiceConnection() {
public void onServiceConnected(ComponentName className, public void onServiceConnected(ComponentName className,
IBinder service) { IBinder service) {
@ -1192,24 +1187,15 @@ public class Orbot extends ActionBarActivity implements TorConstants, OnLongClic
// representation of that from the raw service object. // representation of that from the raw service object.
mService = ITorService.Stub.asInterface(service); mService = ITorService.Stub.asInterface(service);
// We want to monitor the service for as long as we are // We want to monitor the service for as long as we are
// connected to it. // connected to it.
try { try {
torStatus = mService.getStatus(); torStatus = mService.getStatus();
initUpdates(); initUpdates();
if (autoStartFromIntent)
{
startTor();
}
handleIntents(); handleIntents();
updateStatus(""); updateStatus("");
} catch (RemoteException e) { } catch (RemoteException e) {
// In this case the service has crashed before we could even // In this case the service has crashed before we could even
@ -1218,9 +1204,7 @@ public class Orbot extends ActionBarActivity implements TorConstants, OnLongClic
// so there is no need to do anything here. // so there is no need to do anything here.
Log.d(TAG,"error registering callback to service",e); Log.d(TAG,"error registering callback to service",e);
} }
} }
@ -1233,6 +1217,8 @@ public class Orbot extends ActionBarActivity implements TorConstants, OnLongClic
Log.d(TAG,"service was disconnected"); Log.d(TAG,"service was disconnected");
} }
}; };
private void setLocale () private void setLocale ()
@ -1258,7 +1244,6 @@ public class Orbot extends ActionBarActivity implements TorConstants, OnLongClic
if (mConnection != null && mService != null) if (mConnection != null && mService != null)
{ {
unbindService(mConnection); unbindService(mConnection);
mConnection = null;
mService = null; mService = null;
} }
} }

View File

@ -19,12 +19,6 @@ public interface TorConstants {
public final static String NEWLINE = "\n"; 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 INTENT_TOR_SERVICE = "org.torproject.android.service.TOR_SERVICE";
public final static String HANDLER_TOR_MSG = "torServiceMsg"; public final static String HANDLER_TOR_MSG = "torServiceMsg";

View File

@ -52,4 +52,6 @@ interface ITorService {
String[] getLog (); String[] getLog ();
long[] getBandwidth (); long[] getBandwidth ();
boolean flushTransProxy ();
} }

View File

@ -23,6 +23,7 @@ import java.io.PrintStream;
import java.io.PrintWriter; import java.io.PrintWriter;
import java.net.InetSocketAddress; import java.net.InetSocketAddress;
import java.net.Proxy; import java.net.Proxy;
import java.net.ServerSocket;
import java.net.Socket; import java.net.Socket;
import java.net.URL; import java.net.URL;
import java.net.URLConnection; import java.net.URLConnection;
@ -75,6 +76,7 @@ import android.support.v4.app.NotificationCompat;
import android.support.v4.app.NotificationCompat.Builder; import android.support.v4.app.NotificationCompat.Builder;
import android.util.Log; import android.util.Log;
import android.widget.RemoteViews; import android.widget.RemoteViews;
import android.widget.Toast;
public class TorService extends Service implements TorServiceConstants, TorConstants, EventHandler public class TorService extends Service implements TorServiceConstants, TorConstants, EventHandler
{ {
@ -89,15 +91,17 @@ public class TorService extends Service implements TorServiceConstants, TorConst
private Socket torConnSocket = null; private Socket torConnSocket = null;
private int mLastProcessId = -1; private int mLastProcessId = -1;
private int mPortHTTP = 8118;
private int mPortSOCKS = 9050;
private static final int NOTIFY_ID = 1; private static final int NOTIFY_ID = 1;
private static final int TRANSPROXY_NOTIFY_ID = 2; private static final int TRANSPROXY_NOTIFY_ID = 2;
private static final int ERROR_NOTIFY_ID = 3; private static final int ERROR_NOTIFY_ID = 3;
private static final int HS_NOTIFY_ID = 4; private static final int HS_NOTIFY_ID = 4;
private boolean prefPersistNotifications = true; private boolean prefPersistNotifications = true;
private static final String IPADDRESS_PATTERN =
"(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)";
private final static Pattern pattern = Pattern.compile(IPADDRESS_PATTERN);
private static final int MAX_START_TRIES = 3; private static final int MAX_START_TRIES = 3;
@ -178,11 +182,8 @@ public class TorService extends Service implements TorServiceConstants, TorConst
if (mLastProcessId != -1 && conn != null) if (mLastProcessId != -1 && conn != null)
{ {
sendCallbackLogMessage (getString(R.string.found_existing_tor_process)); sendCallbackLogMessage (getString(R.string.found_existing_tor_process));
String msg = conn.getInfo("status/circuit-established");
sendCallbackLogMessage(msg);
currentStatus = STATUS_ON; currentStatus = STATUS_ON;
return true; return true;
} }
@ -339,6 +340,12 @@ public class TorService extends Service implements TorServiceConstants, TorConst
try try
{ {
if (fileTor == null)
initBinariesAndDirectories();
updateSettings ();
mExecutor.execute (new TorStarter(intent)); mExecutor.execute (new TorStarter(intent));
return Service.START_STICKY; return Service.START_STICKY;
@ -567,6 +574,24 @@ public class TorService extends Service implements TorServiceConstants, TorConst
try try
{ {
initBinariesAndDirectories(); initBinariesAndDirectories();
updateSettings();
new Thread(new Runnable ()
{
public void run ()
{
try
{
findExistingProc ();
}
catch (Exception e)
{
Log.e(TAG,"error onBind",e);
}
}
}).start();
} }
catch (Exception e) catch (Exception e)
{ {
@ -575,21 +600,6 @@ public class TorService extends Service implements TorServiceConstants, TorConst
logNotice("There was an error installing Orbot binaries"); logNotice("There was an error installing Orbot binaries");
} }
mExecutor.execute(new Runnable ()
{
public void run ()
{
try
{
findExistingProc ();
}
catch (Exception e)
{
Log.e(TAG,"error onBind",e);
}
}
});
} }
@ -646,12 +656,10 @@ public class TorService extends Service implements TorServiceConstants, TorConst
fileControlPort = new File(appBinHome,"control.txt"); fileControlPort = new File(appBinHome,"control.txt");
extraLines.append(TORRC_CONTROLPORT_FILE_KEY).append(' ').append(fileControlPort.getCanonicalPath()).append('\n'); extraLines.append(TORRC_CONTROLPORT_FILE_KEY).append(' ').append(fileControlPort.getCanonicalPath()).append('\n');
String socksPort = prefs.getString(TorConstants.PREF_SOCKS, TorServiceConstants.PORT_SOCKS_DEFAULT);
String transPort = prefs.getString("pref_transport", TorServiceConstants.TOR_TRANSPROXY_PORT_DEFAULT+""); String transPort = prefs.getString("pref_transport", TorServiceConstants.TOR_TRANSPROXY_PORT_DEFAULT+"");
String dnsPort = prefs.getString("pref_dnsport", TorServiceConstants.TOR_DNS_PORT_DEFAULT+""); String dnsPort = prefs.getString("pref_dnsport", TorServiceConstants.TOR_DNS_PORT_DEFAULT+"");
if (mTransProxyTethering) if (mTransProxyTethering)
{ {
extraLines.append("TransListenAddress 0.0.0.0").append('\n'); extraLines.append("TransListenAddress 0.0.0.0").append('\n');
@ -660,12 +668,9 @@ public class TorService extends Service implements TorServiceConstants, TorConst
} }
extraLines.append("RunAsDaemon 1").append('\n'); extraLines.append("RunAsDaemon 1").append('\n');
extraLines.append("AvoidDiskWrites 1").append('\n'); extraLines.append("AvoidDiskWrites 1").append('\n');
extraLines.append("CircuitStreamTimeout 120").append('\n');
extraLines.append("SOCKSPort ").append(socksPort).append('\n'); extraLines.append("SOCKSPort ").append("auto").append('\n');
extraLines.append("SafeSocks 0").append('\n'); extraLines.append("SafeSocks 0").append('\n');
extraLines.append("TestSocks 0").append('\n'); extraLines.append("TestSocks 0").append('\n');
extraLines.append("WarnUnsafeSocks 1").append('\n'); extraLines.append("WarnUnsafeSocks 1").append('\n');
@ -675,7 +680,6 @@ public class TorService extends Service implements TorServiceConstants, TorConst
extraLines.append("VirtualAddrNetwork 10.192.0.0/10").append('\n'); extraLines.append("VirtualAddrNetwork 10.192.0.0/10").append('\n');
extraLines.append("AutomapHostsOnResolve 1").append('\n'); extraLines.append("AutomapHostsOnResolve 1").append('\n');
extraLines.append(prefs.getString("pref_custom_torrc", "")); extraLines.append(prefs.getString("pref_custom_torrc", ""));
logNotice("updating torrc custom configuration..."); logNotice("updating torrc custom configuration...");
@ -701,7 +705,7 @@ public class TorService extends Service implements TorServiceConstants, TorConst
if (!fileBin.canExecute()) if (!fileBin.canExecute())
{ {
logNotice("(re)Setting permission on binary: " + fileBin.getCanonicalPath()); logNotice("(re)Setting permission on binary: " + fileBin.getCanonicalPath());
//Shell shell = Shell.startShell(new ArrayList<String>(), appBinHome.getCanonicalPath());
Shell shell = Shell.startShell(); Shell shell = Shell.startShell();
shell.add(new SimpleCommand("chmod " + CHMOD_EXE_VALUE + ' ' + fileBin.getCanonicalPath())).waitForFinish(); shell.add(new SimpleCommand("chmod " + CHMOD_EXE_VALUE + ' ' + fileBin.getCanonicalPath())).waitForFinish();
@ -717,6 +721,7 @@ public class TorService extends Service implements TorServiceConstants, TorConst
private void updateSettings () throws TimeoutException, IOException private void updateSettings () throws TimeoutException, IOException
{ {
SharedPreferences prefs = TorServiceUtils.getSharedPrefs(getApplicationContext()); SharedPreferences prefs = TorServiceUtils.getSharedPrefs(getApplicationContext());
mHasRoot = prefs.getBoolean(PREF_HAS_ROOT,false); mHasRoot = prefs.getBoolean(PREF_HAS_ROOT,false);
@ -741,7 +746,9 @@ public class TorService extends Service implements TorServiceConstants, TorConst
currentStatus = STATUS_CONNECTING; currentStatus = STATUS_CONNECTING;
if (fileTor == null)
initBinariesAndDirectories();
enableBinExec(fileTor); enableBinExec(fileTor);
enableBinExec(filePolipo); enableBinExec(filePolipo);
enableBinExec(fileObfsclient); enableBinExec(fileObfsclient);
@ -756,13 +763,35 @@ public class TorService extends Service implements TorServiceConstants, TorConst
runPolipoShellCmd(); runPolipoShellCmd();
if (mHasRoot && mEnableTransparentProxy) if (mHasRoot && mEnableTransparentProxy)
enableTransparentProxy(mTransProxyAll, mTransProxyTethering); {
disableTransparentProxy();
enableTransparentProxy();
}
getHiddenServiceHostname (); getHiddenServiceHostname ();
//checkAddressAndCountry();
} }
private boolean flushTransparentProxyRules () throws Exception
{
if (mHasRoot)
{
if (mTransProxy == null)
{
mTransProxy = new TorTransProxy(this, fileXtables);
}
mTransProxy.flushTransproxyRules(this);
return true;
}
else
{
return false;
}
}
/* /*
* activate means whether to apply the users preferences * activate means whether to apply the users preferences
@ -770,7 +799,7 @@ public class TorService extends Service implements TorServiceConstants, TorConst
* *
* the idea is that if Tor is off then transproxy is off * the idea is that if Tor is off then transproxy is off
*/ */
private boolean enableTransparentProxy (boolean proxyAll, boolean enableTether) throws Exception private boolean enableTransparentProxy () throws Exception
{ {
if (mTransProxy == null) if (mTransProxy == null)
@ -778,7 +807,6 @@ public class TorService extends Service implements TorServiceConstants, TorConst
mTransProxy = new TorTransProxy(this, fileXtables); mTransProxy = new TorTransProxy(this, fileXtables);
} }
SharedPreferences prefs = TorServiceUtils.getSharedPrefs(getApplicationContext()); SharedPreferences prefs = TorServiceUtils.getSharedPrefs(getApplicationContext());
@ -805,7 +833,7 @@ public class TorService extends Service implements TorServiceConstants, TorConst
//clear rules first //clear rules first
// mTransProxy.clearTransparentProxyingAll(this); // mTransProxy.clearTransparentProxyingAll(this);
if(proxyAll) if(mTransProxyAll)
{ {
// showToolbarNotification(getString(R.string.setting_up_full_transparent_proxying_), TRANSPROXY_NOTIFY_ID, R.drawable.ic_stat_tor); // showToolbarNotification(getString(R.string.setting_up_full_transparent_proxying_), TRANSPROXY_NOTIFY_ID, R.drawable.ic_stat_tor);
@ -831,7 +859,7 @@ public class TorService extends Service implements TorServiceConstants, TorConst
if (code == 0) if (code == 0)
{ {
if (enableTether) if (mTransProxyTethering)
{ {
showToolbarNotification(getString(R.string.transproxy_enabled_for_tethering_), TRANSPROXY_NOTIFY_ID, R.drawable.ic_stat_tor); showToolbarNotification(getString(R.string.transproxy_enabled_for_tethering_), TRANSPROXY_NOTIFY_ID, R.drawable.ic_stat_tor);
@ -926,8 +954,6 @@ public class TorService extends Service implements TorServiceConstants, TorConst
private void updatePolipoConfig () throws FileNotFoundException, IOException private void updatePolipoConfig () throws FileNotFoundException, IOException
{ {
SharedPreferences prefs = TorServiceUtils.getSharedPrefs(getApplicationContext());
String socksPort = prefs.getString(TorConstants.PREF_SOCKS, TorServiceConstants.PORT_SOCKS_DEFAULT);
File file = new File(appBinHome, POLIPOCONFIG_ASSET_KEY); File file = new File(appBinHome, POLIPOCONFIG_ASSET_KEY);
@ -935,8 +961,8 @@ public class TorService extends Service implements TorServiceConstants, TorConst
props.load(new FileReader(file)); props.load(new FileReader(file));
props.put("socksParentProxy", "\"localhost:" + socksPort + "\""); props.put("socksParentProxy", "\"localhost:" + mPortSOCKS + "\"");
props.put("proxyPort","8118"); props.put("proxyPort",mPortHTTP+"");
props.store(new FileWriter(file), "updated"); props.store(new FileWriter(file), "updated");
@ -988,17 +1014,6 @@ public class TorService extends Service implements TorServiceConstants, TorConst
} }
/*
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;
}*/
private synchronized int initControlConnection (int maxTries) throws Exception, RuntimeException private synchronized int initControlConnection (int maxTries) throws Exception, RuntimeException
{ {
int i = 0; int i = 0;
@ -1020,12 +1035,10 @@ public class TorService extends Service implements TorServiceConstants, TorConst
torConnSocket = new Socket(IP_LOCALHOST, controlPort); torConnSocket = new Socket(IP_LOCALHOST, controlPort);
torConnSocket.setSoTimeout(CONTROL_SOCKET_TIMEOUT); torConnSocket.setSoTimeout(CONTROL_SOCKET_TIMEOUT);
boolean oo = true;
conn = new TorControlConnection(torConnSocket); conn = new TorControlConnection(torConnSocket);
conn.launchThread(true);//is daemon conn.launchThread(true);//is daemon
logNotice( "SUCCESS connected to Tor control port"); logNotice( "SUCCESS connected to Tor control port.");
File fileCookie = new File(appCacheHome, TOR_CONTROL_COOKIE); File fileCookie = new File(appCacheHome, TOR_CONTROL_COOKIE);
@ -1037,7 +1050,7 @@ public class TorService extends Service implements TorServiceConstants, TorConst
fis.close(); fis.close();
conn.authenticate(cookie); conn.authenticate(cookie);
logNotice( "SUCCESS - authenticated to control port"); logNotice( "SUCCESS - authenticated to control port.");
sendCallbackStatusMessage(getString(R.string.tor_process_starting) + ' ' + getString(R.string.tor_process_complete)); sendCallbackStatusMessage(getString(R.string.tor_process_starting) + ' ' + getString(R.string.tor_process_complete));
@ -1045,24 +1058,51 @@ public class TorService extends Service implements TorServiceConstants, TorConst
String torProcId = conn.getInfo("process/pid"); String torProcId = conn.getInfo("process/pid");
//remove this for now until we can make a clean way to share logs from internal storage
/**
if (ENABLE_DEBUG_LOG) if (ENABLE_DEBUG_LOG)
{ {
//File fileLog = new File(getFilesDir(),"orbot-control-log.txt");
//PrintWriter pr = new PrintWriter(new FileWriter(fileLog,true));
//conn.setDebugging(pr);
File fileLog2 = new File(getFilesDir(),"orbot-tor-log.txt"); File fileLog2 = new File(getFilesDir(),"orbot-tor-log.txt");
conn.setConf("Log", "debug file " + fileLog2.getCanonicalPath()); fileLog2.setReadable(true);
conn.setConf("Log", "debug file " + fileLog2.getCanonicalPath());
}*/
}
String state = conn.getInfo("dormant"); currentStatus = STATUS_CONNECTING;
if (state != null && Integer.parseInt(state) == 0)
currentStatus = STATUS_ON;
else
currentStatus = STATUS_CONNECTING;
String confSocks = conn.getInfo("net/listeners/socks");
StringTokenizer st = new StringTokenizer(confSocks," ");
confSocks = st.nextToken().split(":")[1];
confSocks = confSocks.substring(0,confSocks.length()-1);
mPortSOCKS = Integer.parseInt(confSocks);
SharedPreferences prefs = TorServiceUtils.getSharedPrefs(getApplicationContext());
String socksPortPref = prefs.getString(TorConstants.PREF_SOCKS, TorServiceConstants.PORT_SOCKS_DEFAULT);
try
{
int newSocksPort = Integer.parseInt(socksPortPref);
ServerSocket ss = new ServerSocket(newSocksPort);
ss.close();
ArrayList<String> socksLines = new ArrayList<String>();
socksLines.add("SOCKSPort " + mPortSOCKS);
socksLines.add("SOCKSPort " + socksPortPref);
conn.setConf(socksLines);
mPortSOCKS = newSocksPort;
sendCallbackLogMessage("Local SOCKS port: " + socksPortPref);
}
catch (Exception e)
{
//sendCallbackLogMessage("ERROR adding SOCKS on port: " + socksPortPref);
sendCallbackLogMessage("Local SOCKS port: " + socksPortPref);
}
return Integer.parseInt(torProcId); return Integer.parseInt(torProcId);
} }
@ -1201,7 +1241,15 @@ public class TorService extends Service implements TorServiceConstants, TorConst
* Returns the port number that the HTTP proxy is running on * Returns the port number that the HTTP proxy is running on
*/ */
public int getHTTPPort() throws RemoteException { public int getHTTPPort() throws RemoteException {
return TorServiceConstants.PORT_HTTP; return mPortHTTP;
}
/**
* Returns the port number that the HTTP proxy is running on
*/
public int getSOCKSPort() throws RemoteException {
return mPortSOCKS;
} }
@ -1275,7 +1323,7 @@ public class TorService extends Service implements TorServiceConstants, TorConst
sb.append("): "); sb.append("): ");
sb.append(status); sb.append(status);
logNotice(sb.toString()); debug(sb.toString());
} }
@ -1391,8 +1439,23 @@ public class TorService extends Service implements TorServiceConstants, TorConst
sb.append (" > "); sb.append (" > ");
} }
logNotice(sb.toString()); if (ENABLE_DEBUG_LOG)
debug(sb.toString());
else if(status.equals("BUILT"))
{
if (currentStatus == STATUS_CONNECTING)
currentStatus = STATUS_ON;
logNotice(sb.toString());
}
else if (status.equals("CLOSED"))
{
logNotice(sb.toString());
}
if (mShowExpandedNotifications) if (mShowExpandedNotifications)
{ {
//get IP from last nodename //get IP from last nodename
@ -1408,16 +1471,6 @@ public class TorService extends Service implements TorServiceConstants, TorConst
{ {
hmBuiltNodes.remove(node.id); hmBuiltNodes.remove(node.id);
//how check the IP's of any other nodes we have
for (String nodeId : hmBuiltNodes.keySet())
{
node = hmBuiltNodes.get(nodeId);
if (node.ipAddress == null)
mExecutor.execute(new ExternalIPFetcher(node));
}
} }
} }
@ -1449,15 +1502,12 @@ public class TorService extends Service implements TorServiceConstants, TorConst
public void run () public void run ()
{ {
if (mNode.ipAddress != null)
return;
for (int i = 0; i < MAX_ATTEMPTS; i++) for (int i = 0; i < MAX_ATTEMPTS; i++)
{ {
if (conn != null) if (conn != null)
{ {
try { try {
//String nodeDetails = conn.getInfo("ns/id/"+nodes[0].id);
Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("127.0.0.1", 8118)); Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("127.0.0.1", 8118));
URLConnection conn = new URL(ONIONOO_BASE_URL + mNode.id).openConnection(proxy); URLConnection conn = new URL(ONIONOO_BASE_URL + mNode.id).openConnection(proxy);
@ -1480,15 +1530,13 @@ public class TorService extends Service implements TorServiceConstants, TorConst
JSONObject jsonNodeInfo = new org.json.JSONObject(json.toString()); JSONObject jsonNodeInfo = new org.json.JSONObject(json.toString());
JSONArray jsonRelays = jsonNodeInfo.getJSONArray("relays"); JSONArray jsonRelays = jsonNodeInfo.getJSONArray("relays");
if (jsonRelays.length() > 0) if (jsonRelays.length() > 0)
{ {
mNode.ipAddress = jsonRelays.getJSONObject(0).getJSONArray("or_addresses").getString(0).split(":")[0]; mNode.ipAddress = jsonRelays.getJSONObject(0).getJSONArray("or_addresses").getString(0).split(":")[0];
mNode.country = jsonRelays.getJSONObject(0).getString("country_name"); mNode.country = jsonRelays.getJSONObject(0).getString("country_name");
mNode.organization = jsonRelays.getJSONObject(0).getString("as_name"); mNode.organization = jsonRelays.getJSONObject(0).getString("as_name");
} }
reader.close(); reader.close();
@ -1684,8 +1732,6 @@ public class TorService extends Service implements TorServiceConstants, TorConst
conn.signal("NEWNYM"); conn.signal("NEWNYM");
//checkAddressAndCountry();
} }
catch (Exception ioe){ catch (Exception ioe){
debug("error requesting newnym: " + ioe.getLocalizedMessage()); debug("error requesting newnym: " + ioe.getLocalizedMessage());
@ -1773,11 +1819,27 @@ public class TorService extends Service implements TorServiceConstants, TorConst
} }
} }
@Override
public long[] getBandwidth() throws RemoteException { public long[] getBandwidth() throws RemoteException {
long[] bw = {lastRead,lastWritten,mTotalTrafficRead,mTotalTrafficWritten}; long[] bw = {lastRead,lastWritten,mTotalTrafficRead,mTotalTrafficWritten};
return bw; return bw;
} }
@Override
public boolean flushTransProxy () throws RemoteException {
try
{
return flushTransparentProxyRules();
}
catch (Exception e)
{
Log.e(TAG,"error in transproxy",e);
return false;
}
}
}; };
private ArrayList<String> mStatusBuffer = new ArrayList<String>(); private ArrayList<String> mStatusBuffer = new ArrayList<String>();
@ -1853,7 +1915,7 @@ public class TorService extends Service implements TorServiceConstants, TorConst
if (mHasRoot && mEnableTransparentProxy && mTransProxyNetworkRefresh) if (mHasRoot && mEnableTransparentProxy && mTransProxyNetworkRefresh)
{ {
disableTransparentProxy(); disableTransparentProxy();
enableTransparentProxy(mTransProxyAll, mTransProxyTethering); enableTransparentProxy();
} }
} }
@ -2184,7 +2246,7 @@ public class TorService extends Service implements TorServiceConstants, TorConst
{ {
case TRIM_MEMORY_BACKGROUND: case TRIM_MEMORY_BACKGROUND:
logNotice("trim memory requested: app in the background"); debug("trim memory requested: app in the background");
return; return;
/** /**
@ -2196,7 +2258,7 @@ public class TorService extends Service implements TorServiceConstants, TorConst
case TRIM_MEMORY_COMPLETE: case TRIM_MEMORY_COMPLETE:
logNotice("trim memory requested: cleanup all memory"); debug("trim memory requested: cleanup all memory");
return; return;
/** /**
public static final int TRIM_MEMORY_COMPLETE public static final int TRIM_MEMORY_COMPLETE
@ -2206,7 +2268,7 @@ public class TorService extends Service implements TorServiceConstants, TorConst
*/ */
case TRIM_MEMORY_MODERATE: case TRIM_MEMORY_MODERATE:
logNotice("trim memory requested: clean up some memory"); debug("trim memory requested: clean up some memory");
return; return;
/** /**
@ -2218,7 +2280,7 @@ public class TorService extends Service implements TorServiceConstants, TorConst
case TRIM_MEMORY_RUNNING_CRITICAL: case TRIM_MEMORY_RUNNING_CRITICAL:
logNotice("trim memory requested: memory on device is very low and critical"); debug("trim memory requested: memory on device is very low and critical");
return; return;
/** /**
public static final int TRIM_MEMORY_RUNNING_CRITICAL public static final int TRIM_MEMORY_RUNNING_CRITICAL
@ -2229,7 +2291,7 @@ public class TorService extends Service implements TorServiceConstants, TorConst
case TRIM_MEMORY_RUNNING_LOW: case TRIM_MEMORY_RUNNING_LOW:
logNotice("trim memory requested: memory on device is running low"); debug("trim memory requested: memory on device is running low");
return; return;
/** /**
public static final int TRIM_MEMORY_RUNNING_LOW public static final int TRIM_MEMORY_RUNNING_LOW
@ -2239,7 +2301,7 @@ public class TorService extends Service implements TorServiceConstants, TorConst
*/ */
case TRIM_MEMORY_RUNNING_MODERATE: case TRIM_MEMORY_RUNNING_MODERATE:
logNotice("trim memory requested: memory on device is moderate"); debug("trim memory requested: memory on device is moderate");
return; return;
/** /**
public static final int TRIM_MEMORY_RUNNING_MODERATE public static final int TRIM_MEMORY_RUNNING_MODERATE
@ -2249,7 +2311,7 @@ public class TorService extends Service implements TorServiceConstants, TorConst
*/ */
case TRIM_MEMORY_UI_HIDDEN: case TRIM_MEMORY_UI_HIDDEN:
logNotice("trim memory requested: app is not showing UI anymore"); debug("trim memory requested: app is not showing UI anymore");
return; return;
/** /**

View File

@ -48,10 +48,11 @@ public interface TorServiceConstants {
public final static int FILE_WRITE_BUFFER_SIZE = 1024; public final static int FILE_WRITE_BUFFER_SIZE = 1024;
//HTTP Proxy server port //HTTP Proxy server port
public final static int PORT_HTTP = 8118; //just like Privoxy! public static int PORT_HTTP = 8118; //just like Privoxy!
//Socks port client connects to, server is the Tor binary //Socks port client connects to, server is the Tor binary
public final static String PORT_SOCKS_DEFAULT = "9050"; public static String PORT_SOCKS_DEFAULT = "9050";
//what is says! //what is says!
public final static String IP_LOCALHOST = "127.0.0.1"; public final static String IP_LOCALHOST = "127.0.0.1";

View File

@ -29,8 +29,7 @@ public class TorTransProxy implements TorServiceConstants {
public TorTransProxy (TorService torService, File fileXTables) public TorTransProxy (TorService torService, File fileXTables)
{ {
mTorService = torService; mTorService = torService;
mFileXtables = fileXTables; mFileXtables = fileXTables;
} }
public void setTransProxyPort (int transProxyPort) public void setTransProxyPort (int transProxyPort)
@ -373,7 +372,7 @@ public class TorTransProxy implements TorServiceConstants {
logMessage("enabling transproxy for app: " + tApp.getUsername() + " (" + tApp.getUid() + ")"); logMessage("enabling transproxy for app: " + tApp.getUsername() + " (" + tApp.getUid() + ")");
dropAllIPv6Traffic(context, tApp.getUid()); dropAllIPv6Traffic(context, tApp.getUid(),enableRule);
script = new StringBuilder(); script = new StringBuilder();
@ -532,9 +531,15 @@ public class TorTransProxy implements TorServiceConstants {
} }
public int dropAllIPv6Traffic (Context context, int appUid) throws Exception public int dropAllIPv6Traffic (Context context, int appUid, boolean enableDrop) throws Exception
{ {
String action = " -A ";
String chain = "OUTPUT";
if (!enableDrop)
action = " -D ";
String ip6tablesPath = getIp6TablesPath(context); String ip6tablesPath = getIp6TablesPath(context);
Shell shell = Shell.startRootShell(); Shell shell = Shell.startRootShell();
@ -543,7 +548,8 @@ public class TorTransProxy implements TorServiceConstants {
script = new StringBuilder(); script = new StringBuilder();
script.append(ip6tablesPath); script.append(ip6tablesPath);
script.append(" -A OUTPUT"); script.append(action);
script.append(chain);
if (appUid != -1) if (appUid != -1)
{ {
@ -560,13 +566,13 @@ public class TorTransProxy implements TorServiceConstants {
return lastExit; return lastExit;
} }
/*
public int clearAllIPv6Filters (Context context) throws Exception public int clearAllIPv6Filters (Context context) throws Exception
{ {
String ip6tablesPath = getIp6TablesPath(context); String ip6tablesPath = getIp6TablesPath(context);
Shell shell = Shell.startRootShell(); Shell shell = Shell.startRootShell();
StringBuilder script; StringBuilder script;
script = new StringBuilder(); script = new StringBuilder();
@ -578,6 +584,29 @@ public class TorTransProxy implements TorServiceConstants {
shell.close(); shell.close();
return lastExit; return lastExit;
}*/
public int flushTransproxyRules (Context context) throws Exception
{
int exit = -1;
String ipTablesPath = getIpTablesPath(context);
StringBuilder script = new StringBuilder();
script.append(ipTablesPath);
script.append(" -t nat");
script.append(" -F ");
Shell shell = Shell.startRootShell();
executeCommand (shell, script.toString());
script = new StringBuilder();
script.append(ipTablesPath);
script.append(" -t filter");
script.append(" -F ");
dropAllIPv6Traffic(context,-1,false);
return exit;
} }
public int setTransparentProxyingAll(Context context, boolean enable) throws Exception public int setTransparentProxyingAll(Context context, boolean enable) throws Exception
@ -589,10 +618,7 @@ public class TorTransProxy implements TorServiceConstants {
if (!enable) if (!enable)
action = " -D "; action = " -D ";
if (enable) dropAllIPv6Traffic(context,-1,enable);
dropAllIPv6Traffic(context,-1);
else
clearAllIPv6Filters(context);
String ipTablesPath = getIpTablesPath(context); String ipTablesPath = getIpTablesPath(context);
@ -698,13 +724,13 @@ public class TorTransProxy implements TorServiceConstants {
executeCommand (shell, script.toString()); executeCommand (shell, script.toString());
script = new StringBuilder(); script = new StringBuilder();
//allow access to local SOCKS port //allow access to local HTTP port
script.append(ipTablesPath); script.append(ipTablesPath);
script.append(" -t filter"); script.append(" -t filter");
script.append(action).append(srcChainName); script.append(action).append(srcChainName);
script.append(" -p tcp"); script.append(" -p tcp");
script.append(" -m tcp"); script.append(" -m tcp");
script.append(" --dport ").append(PORT_SOCKS_DEFAULT); script.append(" --dport ").append(mTorService.getHTTPPort());
script.append(" -j ACCEPT"); script.append(" -j ACCEPT");
executeCommand (shell, script.toString()); executeCommand (shell, script.toString());
@ -716,7 +742,7 @@ public class TorTransProxy implements TorServiceConstants {
script.append(action).append(srcChainName); script.append(action).append(srcChainName);
script.append(" -p tcp"); script.append(" -p tcp");
script.append(" -m tcp"); script.append(" -m tcp");
script.append(" --dport ").append(PORT_HTTP); script.append(" --dport ").append(mTorService.getSOCKSPort());
script.append(" -j ACCEPT"); script.append(" -j ACCEPT");
executeCommand (shell, script.toString()); executeCommand (shell, script.toString());
@ -734,19 +760,6 @@ public class TorTransProxy implements TorServiceConstants {
executeCommand (shell, script.toString()); executeCommand (shell, script.toString());
script = new StringBuilder(); script = new StringBuilder();
//allow access to local DNS port
script.append(ipTablesPath);
script.append(" -t filter");
script.append(action).append(srcChainName);
script.append(" -p udp");
script.append(" -m udp");
script.append(" --dport ").append(mDNSPort);
script.append(" -j ACCEPT");
executeCommand (shell, script.toString());
script = new StringBuilder();
// Reject all other packets // Reject all other packets
script.append(ipTablesPath); script.append(ipTablesPath);
script.append(" -t filter"); script.append(" -t filter");

View File

@ -28,6 +28,8 @@ public class SettingsPreferences
private CheckBoxPreference prefCBTransProxy = null; private CheckBoxPreference prefCBTransProxy = null;
private CheckBoxPreference prefcBTransProxyAll = null; private CheckBoxPreference prefcBTransProxyAll = null;
private Preference prefTransProxyFlush = null;
private Preference prefTransProxyApps = null; private Preference prefTransProxyApps = null;
private CheckBoxPreference prefHiddenServices = null; private CheckBoxPreference prefHiddenServices = null;
private CheckBoxPreference prefRequestRoot = null; private CheckBoxPreference prefRequestRoot = null;
@ -37,6 +39,8 @@ public class SettingsPreferences
private final static int HIDDEN_SERVICE_PREF_IDX = 6; private final static int HIDDEN_SERVICE_PREF_IDX = 6;
private final static int TRANSPROXY_GROUP_IDX = 1; private final static int TRANSPROXY_GROUP_IDX = 1;
private final static int DEBUG_GROUP_IDX = 8;
protected void onCreate(Bundle savedInstanceState) protected void onCreate(Bundle savedInstanceState)
{ {
@ -74,6 +78,23 @@ public class SettingsPreferences
prefCBTransProxy = ((CheckBoxPreference)((PreferenceCategory)this.getPreferenceScreen().getPreference(TRANSPROXY_GROUP_IDX)).getPreference(0)); prefCBTransProxy = ((CheckBoxPreference)((PreferenceCategory)this.getPreferenceScreen().getPreference(TRANSPROXY_GROUP_IDX)).getPreference(0));
prefcBTransProxyAll = (CheckBoxPreference)((PreferenceCategory)this.getPreferenceScreen().getPreference(TRANSPROXY_GROUP_IDX)).getPreference(1); prefcBTransProxyAll = (CheckBoxPreference)((PreferenceCategory)this.getPreferenceScreen().getPreference(TRANSPROXY_GROUP_IDX)).getPreference(1);
prefTransProxyFlush = (Preference)((PreferenceCategory)this.getPreferenceScreen().getPreference(DEBUG_GROUP_IDX)).getPreference(8);
prefTransProxyFlush.setOnPreferenceClickListener(new OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference arg0) {
Intent data = new Intent();
data.putExtra("transproxywipe", true);
setResult(RESULT_OK,data);
finish();
return false;
}
});
prefTransProxyApps = ((PreferenceCategory)this.getPreferenceScreen().getPreference(TRANSPROXY_GROUP_IDX)).getPreference(2); prefTransProxyApps = ((PreferenceCategory)this.getPreferenceScreen().getPreference(TRANSPROXY_GROUP_IDX)).getPreference(2);