diff --git a/app/src/main/java/org/torproject/android/OrbotMainActivity.java b/app/src/main/java/org/torproject/android/OrbotMainActivity.java index 0e9e2f72..013c9b43 100644 --- a/app/src/main/java/org/torproject/android/OrbotMainActivity.java +++ b/app/src/main/java/org/torproject/android/OrbotMainActivity.java @@ -5,6 +5,7 @@ package org.torproject.android; import java.io.BufferedReader; import java.io.File; +import java.io.IOException; import java.io.InputStreamReader; import java.io.UnsupportedEncodingException; import java.net.URLDecoder; @@ -64,6 +65,7 @@ import android.support.v7.app.ActionBarDrawerToggle; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.SwitchCompat; import android.support.v7.widget.Toolbar; +import android.text.Html; import android.util.AttributeSet; import android.util.Log; import android.view.GestureDetector; @@ -534,7 +536,16 @@ public class OrbotMainActivity extends AppCompatActivity } TextView versionName = (TextView)view.findViewById(R.id.versionName); - versionName.setText(version); + versionName.setText(version); + + TextView aboutOther = (TextView)view.findViewById(R.id.aboutother); + + try + { + String aboutText = readFromAssets(this,"LICENSE"); + aboutOther.setText(Html.fromHtml(aboutText)); + } + catch (Exception e){} new AlertDialog.Builder(this) .setTitle(getString(R.string.button_about)) @@ -542,6 +553,20 @@ public class OrbotMainActivity extends AppCompatActivity .show(); } + public static String readFromAssets(Context context, String filename) throws IOException { + BufferedReader reader = new BufferedReader(new InputStreamReader(context.getAssets().open(filename))); + + // do reading, usually loop until end of file reading + StringBuilder sb = new StringBuilder(); + String mLine = reader.readLine(); + while (mLine != null) { + sb.append(mLine); // process line + mLine = reader.readLine(); + } + reader.close(); + return sb.toString(); + } + /** * This is our attempt to REALLY exit Orbot, and stop the background service @@ -724,8 +749,6 @@ public class OrbotMainActivity extends AppCompatActivity String action = intent.getAction(); Log.d(TAG, "handleIntents " + action); - //String type = intent.getType(); - if (action == null) return; @@ -944,31 +967,7 @@ public class OrbotMainActivity extends AppCompatActivity if (request == REQUEST_SETTINGS && response == RESULT_OK) { OrbotApp.forceChangeLanguage(this); - if (data != null && data.getBooleanExtra("transproxywipe", false)) - { - - boolean result = flushTransProxy(); - - if (result) - { - Toast.makeText(this, R.string.transparent_proxy_rules_flushed_, Toast.LENGTH_SHORT).show(); - - } - else - { - - Toast.makeText(this, R.string.you_do_not_have_root_access_enabled, Toast.LENGTH_SHORT).show(); - - } - - } - else if (torStatus == TorServiceConstants.STATUS_ON) - { - updateTransProxy(); - // Toast.makeText(this, R.string.you_may_need_to_stop_and_start_orbot_for_settings_change_to_be_enabled_, Toast.LENGTH_SHORT).show(); - - } } else if (request == REQUEST_VPN) { @@ -1184,19 +1183,7 @@ public class OrbotMainActivity extends AppCompatActivity sendIntentToService(TorServiceConstants.CMD_VPN_CLEAR); } - private boolean flushTransProxy () - { - sendIntentToService(TorServiceConstants.CMD_FLUSH); - return true; - } - - private boolean updateTransProxy () - { - sendIntentToService(TorServiceConstants.CMD_UPDATE_TRANS_PROXY); - return true; - } - - @Override + @Override protected void onResume() { super.onResume(); diff --git a/app/src/main/java/org/torproject/android/settings/SettingsPreferences.java b/app/src/main/java/org/torproject/android/settings/SettingsPreferences.java index adacba72..9078b100 100644 --- a/app/src/main/java/org/torproject/android/settings/SettingsPreferences.java +++ b/app/src/main/java/org/torproject/android/settings/SettingsPreferences.java @@ -9,7 +9,6 @@ import android.content.SharedPreferences; import android.os.Build; import android.os.Bundle; import android.preference.CheckBoxPreference; -import android.preference.EditTextPreference; import android.preference.ListPreference; import android.preference.Preference; import android.preference.Preference.OnPreferenceChangeListener; @@ -19,7 +18,6 @@ import android.util.Log; import org.torproject.android.OrbotApp; import org.torproject.android.R; -import org.torproject.android.service.transproxy.TorTransProxy; import org.torproject.android.ui.AppManager; import org.torproject.android.service.util.TorServiceUtils; @@ -30,14 +28,7 @@ public class SettingsPreferences extends PreferenceActivity implements OnPreferenceClickListener { private static final String TAG = "SettingsPreferences"; - private CheckBoxPreference prefCBTransProxy = null; - private CheckBoxPreference prefcBTransProxyAll = null; - private CheckBoxPreference prefcbTransTethering = null; - - private Preference prefTransProxyFlush = null; - private Preference prefTransProxyApps = null; - private CheckBoxPreference prefRequestRoot = null; private ListPreference prefLocale = null; protected void onCreate(Bundle savedInstanceState) { @@ -47,9 +38,6 @@ public class SettingsPreferences getPreferenceManager().setSharedPreferencesMode(Context.MODE_MULTI_PROCESS); SharedPreferences prefs = TorServiceUtils.getSharedPrefs(getApplicationContext()); - prefRequestRoot = (CheckBoxPreference) findPreference("has_root"); - prefRequestRoot.setOnPreferenceClickListener(this); - prefLocale = (ListPreference) findPreference("pref_default_locale"); prefLocale.setOnPreferenceClickListener(this); Languages languages = Languages.get(this); @@ -76,38 +64,9 @@ public class SettingsPreferences } }); - prefCBTransProxy = (CheckBoxPreference) findPreference("pref_transparent"); - prefcBTransProxyAll = (CheckBoxPreference) findPreference("pref_transparent_all"); - prefcbTransTethering = (CheckBoxPreference) findPreference("pref_transparent_tethering"); - prefTransProxyFlush = (Preference) findPreference("pref_transproxy_flush"); - 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 = findPreference("pref_transparent_app_list"); prefTransProxyApps.setOnPreferenceClickListener(this); - prefCBTransProxy.setOnPreferenceClickListener(this); - prefcBTransProxyAll.setOnPreferenceClickListener(this); - - prefCBTransProxy.setEnabled(prefRequestRoot.isChecked()); - prefcBTransProxyAll.setEnabled(prefCBTransProxy.isChecked()); - prefcbTransTethering.setEnabled(prefCBTransProxy.isChecked()); - - if (prefCBTransProxy.isChecked()) - prefTransProxyApps.setEnabled((!prefcBTransProxyAll.isChecked())); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { @@ -120,37 +79,8 @@ public class SettingsPreferences public boolean onPreferenceClick(Preference preference) { setResult(RESULT_OK); - - if (preference == prefRequestRoot) - { - if (prefRequestRoot.isChecked()) - { - try { - TorTransProxy.testRoot(); - prefCBTransProxy.setEnabled(true); - } - catch (Exception e) - { - Log.d(OrbotApp.TAG,"root not yet enabled"); - } - - } - } - else if (preference == prefTransProxyApps) - { - startActivity(new Intent(this, AppManager.class)); - - } - else - { - prefcBTransProxyAll.setEnabled(prefCBTransProxy.isChecked()); - prefTransProxyApps.setEnabled(prefCBTransProxy.isChecked() && (!prefcBTransProxyAll.isChecked())); - - - } - return true; } diff --git a/app/src/main/java/org/torproject/android/ui/AppManager.java b/app/src/main/java/org/torproject/android/ui/AppManager.java index d59eeac2..803061d3 100644 --- a/app/src/main/java/org/torproject/android/ui/AppManager.java +++ b/app/src/main/java/org/torproject/android/ui/AppManager.java @@ -13,9 +13,8 @@ import java.util.StringTokenizer; import org.torproject.android.service.OrbotConstants; import org.torproject.android.R; import org.torproject.android.service.util.TorServiceUtils; -import org.torproject.android.service.transproxy.TorifiedApp; +import org.torproject.android.service.vpn.TorifiedApp; -import android.app.Activity; import android.content.Context; import android.content.SharedPreferences; import android.content.SharedPreferences.Editor; @@ -23,7 +22,6 @@ import android.content.pm.ApplicationInfo; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.os.Bundle; -import android.support.v7.app.ActionBarActivity; import android.support.v7.app.AppCompatActivity; import android.util.Log; import android.view.LayoutInflater; diff --git a/app/src/main/res/layout/layout_about.xml b/app/src/main/res/layout/layout_about.xml index 82f30790..4ac8a431 100644 --- a/app/src/main/res/layout/layout_about.xml +++ b/app/src/main/res/layout/layout_about.xml @@ -54,25 +54,6 @@ android:textColorLink="#ffffff" android:paddingLeft="15px" android:textColor="#ffffff" /> - - - - + android:textColor="#ffffff" /> + + + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 41b9e816..89d72a60 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -61,7 +61,7 @@ Cancel Some Orbot Details - Orbot is an open-source application that contains Tor, LibEvent and Polipo. It provides a local HTTP proxy (8118) and a SOCKS proxy (9050) into the Tor network. Orbot also has the ability, on rooted device, to send all internet traffic through Tor. + Orbot is an open-source application that contains Tor, Obfs4Proxy, BadVPN Tun2Socks, LibEvent and Polipo. It provides a local HTTP proxy (8118) and a SOCKS proxy (9050) into the Tor network. Orbot also has the ability, on rooted device, to send all internet traffic through Tor. Permission Granted Orbot Permissions Excellent! We\'ve detected that you have root permissions enabled for Orbot. We will use this power wisely. diff --git a/build.gradle b/build.gradle index f6627fcf..8674409c 100644 --- a/build.gradle +++ b/build.gradle @@ -4,7 +4,7 @@ buildscript { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:2.3.2' + classpath 'com.android.tools.build:gradle:2.3.3' } } diff --git a/orbotservice/build.gradle b/orbotservice/build.gradle index e46037f5..12407532 100644 --- a/orbotservice/build.gradle +++ b/orbotservice/build.gradle @@ -28,8 +28,8 @@ android { dependencies { compile project(':jsocksAndroid') - compile project(':RootCommands') compile 'com.android.support:appcompat-v7:25.0.0' + compile 'com.jrummyapps:android-shell:1.0.1' compile fileTree(dir: 'libs', include: ['*.jar','*.so']) testCompile 'junit:junit:4.12' } diff --git a/orbotservice/src/main/java/org/torproject/android/service/TorService.java b/orbotservice/src/main/java/org/torproject/android/service/TorService.java index 17000a9d..597e59e2 100644 --- a/orbotservice/src/main/java/org/torproject/android/service/TorService.java +++ b/orbotservice/src/main/java/org/torproject/android/service/TorService.java @@ -38,12 +38,12 @@ import android.text.TextUtils; import android.util.Log; import android.widget.RemoteViews; -import org.sufficientlysecure.rootcommands.Shell; -import org.sufficientlysecure.rootcommands.command.SimpleCommand; +import com.jrummyapps.android.shell.CommandResult; +import com.jrummyapps.android.shell.Shell; + import org.torproject.android.control.ConfigEntry; import org.torproject.android.control.TorControlConnection; -import org.torproject.android.service.transproxy.TorTransProxy; -import org.torproject.android.service.transproxy.TorifiedApp; +import org.torproject.android.service.vpn.TorifiedApp; import org.torproject.android.service.util.DummyActivity; import org.torproject.android.service.util.Prefs; import org.torproject.android.service.util.TorResourceInstaller; @@ -104,8 +104,6 @@ public class TorService extends Service implements TorServiceConstants, OrbotCon private boolean isTorUpgradeAndConfigComplete = false; private File fileControlPort; - - private TorTransProxy mTransProxy; private boolean mConnectivity = true; private int mNetworkType = -1; @@ -127,17 +125,11 @@ public class TorService extends Service implements TorServiceConstants, OrbotCon public static File fileTor; public static File filePolipo; public static File fileObfsclient; - public static File fileXtables; public static File fileTorRc; private File mHSBasePath; - private Shell mShell; - private Shell mShellPolipo; - - private ArrayList alBridges = null; - private static final Uri HS_CONTENT_URI = Uri.parse("content://org.torproject.android.ui.hiddenservices.providers/hs"); private static final Uri COOKIE_CONTENT_URI = Uri.parse("content://org.torproject.android.ui.hiddenservices.providers.cookie/cookie"); @@ -410,10 +402,6 @@ public class TorService extends Service implements TorServiceConstants, OrbotCon requestTorRereadConfig(); } else if (action.equals(CMD_NEWNYM)) { newIdentity(); - } else if (action.equals(CMD_FLUSH)) { - flushTransparentProxyRules(); - } else if (action.equals(CMD_UPDATE_TRANS_PROXY)) { - processTransparentProxying(); } else if (action.equals(CMD_VPN)) { startVPNService(); } else if (action.equals(CMD_VPN_CLEAR)) { @@ -442,6 +430,7 @@ public class TorService extends Service implements TorServiceConstants, OrbotCon stopTor(); + /** try { mShell.close(); @@ -449,7 +438,7 @@ public class TorService extends Service implements TorServiceConstants, OrbotCon catch (IOException ioe) { Log.d(TAG, "Error closing shell",ioe); - } + }**/ super.onDestroy(); } @@ -477,11 +466,6 @@ public class TorService extends Service implements TorServiceConstants, OrbotCon //stop the foreground priority and make sure to remove the persistant notification stopForeground(true); - if (Prefs.useRoot() && Prefs.useTransparentProxying()) - { - disableTransparentProxy(); - } - sendCallbackLogMessage(getString(R.string.status_disabled)); } catch (Exception e) @@ -516,12 +500,13 @@ public class TorService extends Service implements TorServiceConstants, OrbotCon conn = null; } + /** if (mShellPolipo != null) { mShellPolipo.close(); //logNotice("Polipo exited with value: " + exitValue); - } + }**/ } @@ -560,12 +545,11 @@ public class TorService extends Service implements TorServiceConstants, OrbotCon appBinHome = getDir(TorServiceConstants.DIRECTORY_TOR_BINARY, Application.MODE_PRIVATE); appCacheHome = getDir(TorServiceConstants.DIRECTORY_TOR_DATA,Application.MODE_PRIVATE); - mShell = Shell.startShell(); + //mShell = Shell.startShell(); fileTor= new File(appBinHome, TorServiceConstants.TOR_ASSET_KEY); filePolipo = new File(appBinHome, TorServiceConstants.POLIPO_ASSET_KEY); fileObfsclient = new File(appBinHome, TorServiceConstants.OBFSCLIENT_ASSET_KEY); - fileXtables = new File(appBinHome, TorServiceConstants.IPTABLES_ASSET_KEY); fileTorRc = new File(appBinHome, TorServiceConstants.TORRC_ASSET_KEY); mHSBasePath = new File( @@ -802,12 +786,6 @@ public class TorService extends Service implements TorServiceConstants, OrbotCon if (mPortHTTP != -1) runPolipoShellCmd(); - if (Prefs.useRoot() && Prefs.useTransparentProxying()) - { - disableTransparentProxy(); - enableTransparentProxy(); - } - // Tor is running, update new .onion names at db ContentResolver mCR = getApplicationContext().getContentResolver(); Cursor hidden_services = mCR.query(HS_CONTENT_URI, hsProjection, null, null, null); @@ -868,126 +846,8 @@ public class TorService extends Service implements TorServiceConstants, OrbotCon } } - private boolean flushTransparentProxyRules () { - try { - if (Prefs.useRoot()) { - if (mTransProxy == null) - mTransProxy = new TorTransProxy(this, fileXtables); - try { - mTransProxy.flushTransproxyRules(this); - } catch (Exception e) { - e.printStackTrace(); - return false; - } - - return true; - } else { - return false; - } - } - catch (IOException ioe) - { - return false; - } - } - - /* - * activate means whether to apply the users preferences - * or clear them out - * - * the idea is that if Tor is off then transproxy is off - */ - private boolean enableTransparentProxy () throws Exception - { - - if (mTransProxy == null) - { - mTransProxy = new TorTransProxy(this, fileXtables); - - } - - SharedPreferences prefs = TorServiceUtils.getSharedPrefs(getApplicationContext()); - String transProxy = prefs.getString("pref_transport", TorServiceConstants.TOR_TRANSPROXY_PORT_DEFAULT+""); - String dnsPort = prefs.getString("pref_dnsport", TorServiceConstants.TOR_TRANSPROXY_PORT_DEFAULT+""); - - if (transProxy.indexOf(':')!=-1) //we just want the port for this - transProxy = transProxy.split(":")[1]; - - if (dnsPort.indexOf(':')!=-1) //we just want the port for this - dnsPort = dnsPort.split(":")[1]; - - mTransProxy.setTransProxyPort(Integer.parseInt(transProxy)); - mTransProxy.setDNSPort(Integer.parseInt(dnsPort)); - - int code = 0; // Default state is "okay" - - if(Prefs.transparentProxyAll()) - { - - code = mTransProxy.setTransparentProxyingAll(this, true); - } - else - { - ArrayList apps = TorTransProxy.getApps(this, TorServiceUtils.getSharedPrefs(getApplicationContext())); - - code = mTransProxy.setTransparentProxyingByApp(this,apps, true); - } - - debug ("TorTransProxy resp code: " + code); - - if (code == 0) - { - - if (Prefs.transparentTethering()) - { - showToolbarNotification(getString(R.string.transproxy_enabled_for_tethering_), TRANSPROXY_NOTIFY_ID, R.drawable.ic_stat_tor); - - mTransProxy.enableTetheringRules(this); - - - } - else - { - showToolbarNotification(getString(R.string.transparent_proxying_enabled), TRANSPROXY_NOTIFY_ID, R.drawable.ic_stat_tor); - - } - } - else - { - showToolbarNotification(getString(R.string.warning_error_starting_transparent_proxying_), TRANSPROXY_NOTIFY_ID, R.drawable.ic_stat_tor); - - } - - return true; - } - - /* - * activate means whether to apply the users preferences - * or clear them out - * - * the idea is that if Tor is off then transproxy is off - */ - private boolean disableTransparentProxy () throws Exception - { - - debug ("Transparent Proxying: disabling..."); - - if (mTransProxy == null) - mTransProxy = new TorTransProxy(this, fileXtables); - - mTransProxy.setTransparentProxyingAll(this, false); - - ArrayList apps = TorTransProxy.getApps(this, TorServiceUtils.getSharedPrefs(getApplicationContext())); - mTransProxy.setTransparentProxyingByApp(this, apps, false); - - mTransProxy.closeShell(); - mTransProxy = null; - - return true; - } - private boolean runTorShellCmd() throws Exception { boolean result = true; @@ -1055,13 +915,18 @@ public class TorService extends Service implements TorServiceConstants, OrbotCon private int exec (String cmd, boolean wait) throws Exception { + CommandResult shellResult = Shell.run(cmd); + shellResult.isSuccessful(); + debug("CMD: " + cmd + "; SUCCESS=" + shellResult.isSuccessful()); + + /** SimpleCommand command = new SimpleCommand(cmd); mShell.add(command); - if (wait) command.waitForFinish(); - return command.getExitCode(); + **/ + return shellResult.exitCode; } private void updatePolipoConfig () throws FileNotFoundException, IOException @@ -1092,12 +957,7 @@ public class TorService extends Service implements TorServiceConstants, OrbotCon String polipoConfigPath = new File(appBinHome, POLIPOCONFIG_ASSET_KEY).getCanonicalPath(); String cmd = (filePolipo.getCanonicalPath() + " -c " + polipoConfigPath); - if (mShellPolipo != null) - mShellPolipo.close(); - - mShellPolipo = Shell.startShell(); - SimpleCommand cmdPolipo = new SimpleCommand(cmd); - mShellPolipo.add(cmdPolipo); + CommandResult shellResult = Shell.run(cmd); sendCallbackLogMessage(getString(R.string.privoxy_is_running_on_port_) + mPortHTTP); @@ -1277,28 +1137,6 @@ public class TorService extends Service implements TorServiceConstants, OrbotCon } - - - - - - public void processTransparentProxying() { - try{ - if (Prefs.useRoot()) - { - if (Prefs.useTransparentProxying()){ - enableTransparentProxy(); - } else { - disableTransparentProxy(); - } - } - } catch (Exception e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - - } - public String getInfo (String key) { try { if(conn !=null){ @@ -1587,25 +1425,6 @@ public class TorService extends Service implements TorServiceConstants, OrbotCon showToolbarNotification(getString(R.string.status_activated),NOTIFY_ID,R.drawable.ic_stat_tor); } - try { - - if (mConnectivity) - { - if (Prefs.useRoot() && Prefs.useTransparentProxying() && Prefs.transProxyNetworkRefresh()) - { - - - disableTransparentProxy(); - enableTransparentProxy(); - - } - } - - } catch (Exception e) { - logException ("error updating state after network restart",e); - } - - } @@ -2045,7 +1864,6 @@ public class TorService extends Service implements TorServiceConstants, OrbotCon { debug ("clearing VPN Proxy"); Prefs.putUseVpn(false); - processTransparentProxying(); Intent intentVpn = new Intent(this,TorVpnService.class); intentVpn.setAction("stop"); diff --git a/orbotservice/src/main/java/org/torproject/android/service/transproxy/TorTransProxy.java b/orbotservice/src/main/java/org/torproject/android/service/transproxy/TorTransProxy.java deleted file mode 100644 index 8d37bd9b..00000000 --- a/orbotservice/src/main/java/org/torproject/android/service/transproxy/TorTransProxy.java +++ /dev/null @@ -1,997 +0,0 @@ -package org.torproject.android.service.transproxy; - -import java.io.DataOutputStream; -import java.io.File; -import java.io.IOException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.Iterator; -import java.util.List; -import java.util.StringTokenizer; - -import android.content.Context; -import android.content.SharedPreferences; -import android.content.pm.ApplicationInfo; -import android.content.pm.PackageInfo; -import android.content.pm.PackageManager; - -import org.sufficientlysecure.rootcommands.Shell; -import org.sufficientlysecure.rootcommands.command.SimpleCommand; -import org.torproject.android.service.OrbotConstants; -import org.torproject.android.service.util.Prefs; -import org.torproject.android.service.TorService; -import org.torproject.android.service.TorServiceConstants; - -public class TorTransProxy implements TorServiceConstants { - - private String mSysIptables = null; - private TorService mTorService = null; - private File mFileXtables = null; - - private final static String ALLOW_LOCAL = " ! -d 127.0.0.1"; - - private int mTransProxyPort = TOR_TRANSPROXY_PORT_DEFAULT; - private int mDNSPort = TOR_DNS_PORT_DEFAULT; - - private Shell mShell; - - public TorTransProxy (TorService torService, File fileXTables) throws IOException - { - mTorService = torService; - mFileXtables = fileXTables; - - // start root shell - mShell = Shell.startRootShell(); - - } - - public static boolean testRoot () throws IOException - { - Runtime.getRuntime().exec("su"); - return true; - } - - public void setTransProxyPort (int transProxyPort) - { - mTransProxyPort = transProxyPort; - } - - public void setDNSPort (int dnsPort) - { - mDNSPort = dnsPort; - } - - public String getIpTablesPath (Context context) - { - - String ipTablesPath = null; - - if (Prefs.useSystemIpTables()) - { - ipTablesPath = findSystemIPTables(); - } - else - { - ipTablesPath = mFileXtables.getAbsolutePath(); - ipTablesPath += " iptables"; //append subcommand since we are using xtables now - - } - - return ipTablesPath; - } - - public String getIp6TablesPath (Context context) - { - - String ipTablesPath = null; - - if (Prefs.useSystemIpTables()) - { - ipTablesPath = findSystemIP6Tables(); - } - else - { - ipTablesPath = mFileXtables.getAbsolutePath(); - ipTablesPath += " ip6tables"; //append subcommand since we are using xtables now - - } - - return ipTablesPath; - - } - - private String findSystemIPTables () - { - if (mSysIptables == null) { - //if the user wants us to use the built-in iptables, then we have to find it - File fileIpt = new File("/system/xbin/iptables"); - - if (fileIpt.exists()) - mSysIptables = fileIpt.getAbsolutePath(); - else { - - fileIpt = new File("/system/bin/iptables"); - - if (fileIpt.exists()) - mSysIptables = fileIpt.getAbsolutePath(); - } - } - - return mSysIptables; - } - - - - private String findSystemIP6Tables () - { - - //if the user wants us to use the built-in iptables, then we have to find it - File fileIpt = new File("/system/xbin/ip6tables"); - - if (fileIpt.exists()) - mSysIptables = fileIpt.getAbsolutePath(); - else - { - - fileIpt = new File("/system/bin/ip6tables"); - - if (fileIpt.exists()) - mSysIptables = fileIpt.getAbsolutePath(); - } - - - return mSysIptables; - } - - /* - public int flushIptablesAll(Context context) throws Exception { - - String ipTablesPath = getIpTablesPath(context); - - final StringBuilder script = new StringBuilder(); - - StringBuilder res = new StringBuilder(); - int code = -1; - - script.append(ipTablesPath); - script.append(" -t nat"); - script.append(" -F || exit\n"); - - script.append(ipTablesPath); - script.append(" -t filter"); - script.append(" -F || exit\n"); - - String[] cmd = {script.toString()}; - code = TorServiceUtils.doShellCommand(cmd, res, true, true); - String msg = res.toString(); - - TorService.logMessage(cmd[0] + ";errCode=" + code + ";resp=" + msg); - - - return code; - - }*/ - - /* - public static int purgeIptablesByApp(Context context, TorifiedApp[] apps) throws Exception { - - //restoreDNSResolvConf(); //not working yet - - String ipTablesPath = new File(context.getDir("bin", 0),"iptables").getAbsolutePath(); - - final StringBuilder script = new StringBuilder(); - - StringBuilder res = new StringBuilder(); - int code = -1; - - for (int i = 0; i < apps.length; i++) - { - //flush nat for every app - script.append(ipTablesPath); - script.append(" -t nat -m owner --uid-owner "); - script.append(tApp.getUid()); - script.append(" -F || exit\n"); - public static ArrayList getApps (Context context, SharedPreferences prefs) - { - - 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 lAppInfo = pMgr.getInstalledApplications(0); - - Iterator itAppInfo = lAppInfo.iterator(); - - ArrayList apps = new ArrayList(); - - ApplicationInfo aInfo = null; - - int appIdx = 0; - TorifiedApp app = null; - - while (itAppInfo.hasNext()) - { - aInfo = itAppInfo.next(); - - app = new TorifiedApp(); - - try { - PackageInfo pInfo = pMgr.getPackageInfo(aInfo.packageName, PackageManager.GET_PERMISSIONS); - - if (pInfo != null && pInfo.requestedPermissions != null) - { - for (String permInfo:pInfo.requestedPermissions) - { - if (permInfo.equals("android.permission.INTERNET")) - { - app.setUsesInternet(true); - - } - } - - } - - - } catch (Exception e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - - if ((aInfo.flags & ApplicationInfo.FLAG_SYSTEM) == 1) - { - //System app - app.setUsesInternet(true); - } - - - if (!app.usesInternet()) - continue; - else - { - apps.add(app); - } - - - app.setEnabled(aInfo.enabled); - app.setUid(aInfo.uid); - app.setUsername(pMgr.getNameForUid(app.getUid())); - app.setProcname(aInfo.processName); - app.setPackageName(aInfo.packageName); - - try - { - app.setName(pMgr.getApplicationLabel(aInfo).toString()); - } - catch (Exception e) - { - app.setName(aInfo.packageName); - } - - - //app.setIcon(pMgr.getApplicationIcon(aInfo)); - - // check if this application is allowed - if (Arrays.binarySearch(tordApps, app.getUsername()) >= 0) { - app.setTorified(true); - } - else - { - app.setTorified(false); - } - - appIdx++; - } - - Collections.sort(apps); - - return apps; - } - - - script.append(ipTablesPath); - script.append(" -t filter -m owner --uid-owner "); - script.append(tApp.getUid()); - script.append(" -F || exit\n"); - - } - - - String[] cmd = {script.toString()}; - code = TorServiceUtils.doShellCommand(cmd, res, true, true); - String msg = res.toString(); - logNotice(cmd[0] + ";errCode=" + code + ";resp=" + msg); - - - return code; - - }*/ - - - /* - // 9/19/2010 - NF This code is in process... /etc path on System partition - // is read-only on Android for now. - public static int redirectDNSResolvConf () throws Exception - { - StringBuilder script = new StringBuilder(); - StringBuilder res = new StringBuilder(); - int code = -1; - - //mv resolv.conf to resolve.conf.bak - String cmd = "mv /etc/resolv.conf /etc/resolv.conf.bak"; - script.append(cmd); - - //create new resolve.conf pointing to localhost/127.0.0.1 - cmd = "echo \"nameserver 127.0.0.1\" > /etc/resolv.conf"; - script.append(cmd); - - String[] cmdFlush = {script.toString()}; - code = TorServiceUtils.doShellCommand(cmdFlush, res, true, true); - //String msg = res.toString(); //get stdout from command - - - return code; - } - - public static int restoreDNSResolvConf () throws Exception - { - StringBuilder script = new StringBuilder(); - StringBuilder res = new StringBuilder(); - int code = -1; - - //mv resolv.conf to resolve.conf.bak - String cmd = "mv /etc/resolv.conf.bak /etc/resolv.conf"; - script.append(cmd); - script.append(" || exit\n"); - - String[] cmdFlush = {script.toString()}; - code = TorServiceUtils.doShellCommand(cmdFlush, res, true, true); - //String msg = res.toString(); //get stdout from command - - return code; - } - */ - /* - public int testOwnerModule(Context context, String ipTablesPath) throws Exception - { - - TorBinaryInstaller.assertIpTablesBinaries(context, false); - - boolean runRoot = true; - boolean waitFor = true; - - int torUid = context.getApplicationInfo().uid; - - StringBuilder script = new StringBuilder(); - - StringBuilder res = new StringBuilder(); - int code = -1; - - // Allow everything for Tor - script.append(ipTablesPath); - script.append(" -A OUTPUT"); - script.append(" -t filter"); - script.append(" -m owner --uid-owner "); - script.append(torUid); - script.append(" -j ACCEPT"); - script.append(" || exit\n"); - - script.append(ipTablesPath); - script.append(" -D OUTPUT"); - script.append(" -t filter"); - script.append(" -m owner --uid-owner "); - script.append(torUid); - script.append(" -j ACCEPT"); - script.append(" || exit\n"); - - String[] cmdAdd = {script.toString()}; - - code = TorServiceUtils.doShellCommand(cmdAdd, res, runRoot, waitFor); - String msg = res.toString(); - - if (mTorService != null) - logMessage(cmdAdd[0] + ";errCode=" + code + ";resp=" + msg); - - - return code; - } - */ - - /* - public int clearTransparentProxyingByApp (Context context, ArrayList apps) throws Exception - { - boolean runRoot = true; - boolean waitFor = true; - - String ipTablesPath = getIpTablesPath(context); - - StringBuilder script = new StringBuilder(); - - StringBuilder res = new StringBuilder(); - int code = -1; - - String chainName = "ORBOT"; - String jumpChainName = "OUTPUT"; - - script.append(ipTablesPath); - script.append(" --flush ").append(chainName); //delete previous user-defined chain - script.append(" || exit\n"); - - script.append(ipTablesPath); - script.append(" -D ").append(jumpChainName); - script.append(" -j ").append(chainName); - script.append(" || exit\n"); - - script.append(ipTablesPath); - script.append(" -X ").append(chainName); //delete previous user-defined chain - script.append(" || exit\n"); - - String[] cmdAdd = {script.toString()}; - - code = TorServiceUtils.doShellCommand(cmdAdd, res, runRoot, waitFor); - String msg = res.toString(); - - logMessage(cmdAdd[0] + ";errCode=" + code + ";resp=" + msg); - - return code; - }*/ - - public int setTransparentProxyingByApp(Context context, ArrayList apps, boolean enableRule) throws Exception - { - String ipTablesPath = getIpTablesPath(context); - - //StringBuilder script = new StringBuilder(); - - String action = " -A "; - String srcChainName = "OUTPUT"; - - if (!enableRule) - action = " -D "; - - //run the delete commands in a separate process as it might error out - //String[] cmdExecClear = {script.toString()}; - //code = TorServiceUtils.doShellCommand(cmdExecClear, res, runRoot, waitFor); - - //reset script - - int lastExit = -1; - StringBuilder script; - - - // Same for DNS - script = new StringBuilder(); - script.append(ipTablesPath); - script.append(" -t nat"); - script.append(action).append(srcChainName); - script.append(" -p udp"); - //script.append(" -m owner --uid-owner "); - //script.append(tApp.getUid()); - //script.append(" -m udp --dport "); - script.append(" --dport "); - script.append(STANDARD_DNS_PORT); - script.append(" -j REDIRECT --to-ports "); - script.append(mDNSPort); - executeCommand (script.toString()); - - // Allow everything for Tor - - //build up array of shell cmds to execute under one root context - for (TorifiedApp tApp:apps) - { - - if (((!enableRule) || tApp.isTorified()) - && (!tApp.getUsername().equals(TOR_APP_USERNAME)) - ) //if app is set to true - { - - - logMessage("transproxy for app: " + tApp.getUsername() + " (" + tApp.getUid() + "): enable=" + enableRule); - - dropAllIPv6Traffic(context, tApp.getUid(),enableRule); - - script = new StringBuilder(); - - // Allow loopback - /** - script.append(ipTablesPath); - script.append(" -t filter"); - script.append(action).append(srcChainName); - script.append(" -m owner --uid-owner "); - script.append(tApp.getUid()); - script.append(" -o lo"); - script.append(" -j ACCEPT"); - - executeCommand (shell, script.toString()); - script = new StringBuilder(); - **/ - - // Set up port redirection - script.append(ipTablesPath); - script.append(" -t nat"); - script.append(action).append(srcChainName); - script.append(" -p tcp"); - script.append(ALLOW_LOCAL); - script.append(" -m owner --uid-owner "); - script.append(tApp.getUid()); - script.append(" -m tcp --syn"); - script.append(" -j REDIRECT --to-ports "); - script.append(mTransProxyPort); - - executeCommand (script.toString()); - - - script = new StringBuilder(); - - // Reject all other outbound packets - script.append(ipTablesPath); - script.append(" -t filter"); - script.append(action).append(srcChainName); - script.append(" -m owner --uid-owner "); - script.append(tApp.getUid()); - script.append(ALLOW_LOCAL); - script.append(" -j REJECT"); - - lastExit = executeCommand (script.toString()); - - - } - } - - return lastExit; - } - - private int executeCommand (String cmdString) throws Exception { - - SimpleCommand command = new SimpleCommand(cmdString); - - mShell.add(command).waitForFinish(); - - logMessage("Command Exec: " + cmdString); - logMessage("Output: " + command.getOutput()); - logMessage("Exit code: " + command.getExitCode()); - - return 0; - } - - public void closeShell () throws IOException - { - mShell.close(); - } - - public int enableTetheringRules (Context context) throws Exception - { - - String ipTablesPath = getIpTablesPath(context); - - StringBuilder script = new StringBuilder(); - - String[] hwinterfaces = {"usb0","wl0.1"}; - - - int lastExit = -1; - - for (int i = 0; i < hwinterfaces.length; i++) - { - - script = new StringBuilder(); - script.append(ipTablesPath); - script.append(" -t nat -A PREROUTING -i "); - script.append(hwinterfaces[i]); - script.append(" -p udp --dport 53 -j REDIRECT --to-ports "); - script.append(mDNSPort); - - executeCommand (script.toString()); - script = new StringBuilder(); - - - script = new StringBuilder(); - script.append(ipTablesPath); - script.append(" -t nat -A PREROUTING -i "); - script.append(hwinterfaces[i]); - script.append(" -p tcp -j REDIRECT --to-ports "); - script.append(mTransProxyPort); - - lastExit = executeCommand (script.toString()); - script = new StringBuilder(); - - - } - - return lastExit; - } - - private void logMessage (String msg) - { - if (mTorService != null) - mTorService.debug(msg); - } - - - - public int fixTransproxyLeak (Context context) throws Exception - { - String ipTablesPath = getIpTablesPath(context); - - StringBuilder script = new StringBuilder(); - script.append(ipTablesPath); - script.append(" -I OUTPUT ! -o lo ! -d 127.0.0.1 ! -s 127.0.0.1 -p tcp -m tcp --tcp-flags ACK,FIN ACK,FIN -j DROP"); - - executeCommand (script.toString()); - script = new StringBuilder(); - - script = new StringBuilder(); - script.append(ipTablesPath); - script.append(" -I OUTPUT ! -o lo ! -d 127.0.0.1 ! -s 127.0.0.1 -p tcp -m tcp --tcp-flags ACK,RST ACK,RST -j DROP"); - - int lastExit = executeCommand (script.toString()); - script = new StringBuilder(); - - return lastExit; - - } - - 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); - - StringBuilder script; - - script = new StringBuilder(); - script.append(ip6tablesPath); - script.append(action); - script.append(chain); - - if (appUid != -1) - { - script.append(" -m owner --uid-owner "); - script.append(appUid); - } - - script.append(" -j DROP"); - - int lastExit = executeCommand (script.toString()); - - return lastExit; - } - - /* - public int clearAllIPv6Filters (Context context) throws Exception - { - - String ip6tablesPath = getIp6TablesPath(context); - Shell shell = Shell.startRootShell(); - - StringBuilder script; - - script = new StringBuilder(); - script.append(ip6tablesPath); - script.append(" -t filter"); - script.append(" -F OUTPUT"); - int lastExit = executeCommand (shell, script.toString()); - - shell.close(); - - 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 "); - - executeCommand (script.toString()); - - script = new StringBuilder(); - script.append(ipTablesPath); - script.append(" -t filter "); - script.append(" -F "); - executeCommand (script.toString()); - - dropAllIPv6Traffic(context,-1,false); - dropAllIPv6Traffic(context,-1,false); - - - return exit; - } - - public int setTransparentProxyingAll(Context context, boolean enable) throws Exception - { - - String action = " -A "; - String srcChainName = "OUTPUT"; - - if (!enable) - action = " -D "; - - dropAllIPv6Traffic(context,-1,enable); - - String ipTablesPath = getIpTablesPath(context); - - - int torUid = context.getApplicationInfo().uid; - - StringBuilder script = new StringBuilder(); - - // Allow everything for Tor - - script.append(ipTablesPath); - script.append(" -t nat"); - script.append(action).append(srcChainName); - script.append(" -m owner --uid-owner "); - script.append(torUid); - script.append(" -j ACCEPT"); - - executeCommand (script.toString()); - script = new StringBuilder(); - - // Allow loopback - - script.append(ipTablesPath); - script.append(" -t nat"); - script.append(action).append(srcChainName); - script.append(" -o lo"); - script.append(" -j ACCEPT"); - - executeCommand (script.toString()); - script = new StringBuilder(); - - // Set up port redirection - script.append(ipTablesPath); - script.append(" -t nat"); - script.append(action).append(srcChainName); - script.append(" -p tcp"); - script.append(ALLOW_LOCAL); //allow access to localhost - script.append(" -m owner ! --uid-owner "); - script.append(torUid); - script.append(" -m tcp --syn"); - script.append(" -j REDIRECT --to-ports "); - script.append(mTransProxyPort); - - executeCommand (script.toString()); - script = new StringBuilder(); - - // Same for DNS - script.append(ipTablesPath); - script.append(" -t nat"); - script.append(action).append(srcChainName); - script.append(" -p udp"); - script.append(ALLOW_LOCAL); //allow access to localhost - script.append(" -m owner ! --uid-owner "); - script.append(torUid); - //script.append(" -m udp --dport "); - script.append(" --dport "); - script.append(STANDARD_DNS_PORT); - script.append(" -j REDIRECT --to-ports "); - script.append(mDNSPort); - - executeCommand (script.toString()); - script = new StringBuilder(); - - - /** - if (Prefs.useDebugLogging()) - { - //XXX: Comment the following rules for non-debug builds - script.append(ipTablesPath); - script.append(" -t filter"); - script.append(action).append(srcChainName); - script.append(" -p udp"); - script.append(" --dport "); - script.append(STANDARD_DNS_PORT); - script.append(" -j LOG"); - script.append(" --log-prefix='ORBOT_DNSLEAK_PROTECTION'"); - script.append(" --log-uid"); - - executeCommand (script.toString()); - script = new StringBuilder(); - - script.append(ipTablesPath); - script.append(" -t filter"); - script.append(action).append(srcChainName); - script.append(" -p tcp"); - script.append(" -j LOG"); - script.append(" --log-prefix='ORBOT_TCPLEAK_PROTECTION'"); - script.append(" --log-uid"); - - executeCommand (script.toString()); - script = new StringBuilder(); - - }**/ - - //allow access to transproxy port - script.append(ipTablesPath); - script.append(" -t filter"); - script.append(action).append(srcChainName); - script.append(" -p tcp"); - script.append(" -m tcp"); - script.append(" --dport ").append(mTransProxyPort); - script.append(" -j ACCEPT"); - - executeCommand (script.toString()); - script = new StringBuilder(); - - //allow access to local HTTP port - script.append(ipTablesPath); - script.append(" -t filter"); - script.append(action).append(srcChainName); - script.append(" -p tcp"); - script.append(" -m tcp"); - script.append(" --dport ").append(mTorService.getHTTPPort()); - script.append(" -j ACCEPT"); - - executeCommand (script.toString()); - script = new StringBuilder(); - - //allow access to local SOCKS port - script.append(ipTablesPath); - script.append(" -t filter"); - script.append(action).append(srcChainName); - script.append(" -p tcp"); - script.append(" -m tcp"); - script.append(" --dport ").append(mTorService.getSOCKSPort()); - script.append(" -j ACCEPT"); - - executeCommand (script.toString()); - 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 (script.toString()); - script = new StringBuilder(); - - // Reject all other packets - script.append(ipTablesPath); - script.append(" -t filter"); - script.append(action).append(srcChainName); - script.append(" -m owner ! --uid-owner "); - script.append(torUid); - script.append(ALLOW_LOCAL); //allow access to localhost - script.append(" -j REJECT"); - - int lastExit = executeCommand (script.toString()); - - // fixTransproxyLeak (context); - - return lastExit; - } - - - public static ArrayList getApps (Context context, SharedPreferences prefs) - { - - String tordAppString = prefs.getString(OrbotConstants.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 lAppInfo = pMgr.getInstalledApplications(0); - - Iterator itAppInfo = lAppInfo.iterator(); - - ArrayList apps = new ArrayList(); - - ApplicationInfo aInfo = null; - - int appIdx = 0; - TorifiedApp app = null; - - while (itAppInfo.hasNext()) - { - aInfo = itAppInfo.next(); - - app = new TorifiedApp(); - - try { - PackageInfo pInfo = pMgr.getPackageInfo(aInfo.packageName, PackageManager.GET_PERMISSIONS); - - if (pInfo != null && pInfo.requestedPermissions != null) - { - for (String permInfo:pInfo.requestedPermissions) - { - if (permInfo.equals("android.permission.INTERNET")) - { - app.setUsesInternet(true); - - } - } - - } - - - } catch (Exception e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - - if ((aInfo.flags & ApplicationInfo.FLAG_SYSTEM) == 1) - { - //System app - app.setUsesInternet(true); - } - - - if (!app.usesInternet()) - continue; - else - { - apps.add(app); - } - - - app.setEnabled(aInfo.enabled); - app.setUid(aInfo.uid); - app.setUsername(pMgr.getNameForUid(app.getUid())); - app.setProcname(aInfo.processName); - app.setPackageName(aInfo.packageName); - - try - { - app.setName(pMgr.getApplicationLabel(aInfo).toString()); - } - catch (Exception e) - { - app.setName(aInfo.packageName); - } - - - //app.setIcon(pMgr.getApplicationIcon(aInfo)); - - // check if this application is allowed - if (Arrays.binarySearch(tordApps, app.getUsername()) >= 0) { - app.setTorified(true); - } - else - { - app.setTorified(false); - } - - appIdx++; - } - - Collections.sort(apps); - - return apps; - } - -} diff --git a/orbotservice/src/main/java/org/torproject/android/service/vpn/OrbotVpnManager.java b/orbotservice/src/main/java/org/torproject/android/service/vpn/OrbotVpnManager.java index ea072504..3d54e888 100644 --- a/orbotservice/src/main/java/org/torproject/android/service/vpn/OrbotVpnManager.java +++ b/orbotservice/src/main/java/org/torproject/android/service/vpn/OrbotVpnManager.java @@ -38,7 +38,6 @@ import com.runjva.sourceforge.jsocks.server.ServerAuthenticatorNone; import org.torproject.android.service.R; import org.torproject.android.service.TorServiceConstants; -import org.torproject.android.service.transproxy.TorifiedApp; import org.torproject.android.service.util.TorServiceUtils; import java.io.BufferedReader; @@ -46,7 +45,6 @@ import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; -import java.io.InputStream; import java.io.InputStreamReader; import java.io.PrintStream; import java.net.InetAddress; diff --git a/orbotservice/src/main/java/org/torproject/android/service/transproxy/TorifiedApp.java b/orbotservice/src/main/java/org/torproject/android/service/vpn/TorifiedApp.java similarity index 98% rename from orbotservice/src/main/java/org/torproject/android/service/transproxy/TorifiedApp.java rename to orbotservice/src/main/java/org/torproject/android/service/vpn/TorifiedApp.java index c786905d..c72ebe3b 100644 --- a/orbotservice/src/main/java/org/torproject/android/service/transproxy/TorifiedApp.java +++ b/orbotservice/src/main/java/org/torproject/android/service/vpn/TorifiedApp.java @@ -1,4 +1,4 @@ -package org.torproject.android.service.transproxy; +package org.torproject.android.service.vpn; import android.content.Context; import android.content.SharedPreferences; diff --git a/orbotservice/src/main/res/values/strings.xml b/orbotservice/src/main/res/values/strings.xml index 59fcb771..27760d16 100644 --- a/orbotservice/src/main/res/values/strings.xml +++ b/orbotservice/src/main/res/values/strings.xml @@ -112,7 +112,7 @@ Find all Guardian Project apps on F-Droid Find all Guardian Project apps on https://f-droid.org - Transparent Proxying + Tunneled Apps This allows your apps to automatically run through the Tor network without any configuration. (Check this box if you have no idea what we are talking about) None @@ -286,14 +286,6 @@ "Please disable this app in Android->Settings->Apps if you are having problems with Orbot: " App Conflict - - Transproxy Auto-Refresh - Re-apply Transproxy rules when the network state changes - - Transproxy FORCE REMOVE - Tap here to flush all transproxy network rules NOW - Transparent proxy rules flushed! - You do not have ROOT access enabled You may need to stop and start Orbot for settings change to be enabled. VPN diff --git a/settings.gradle b/settings.gradle index 7453139d..9984a03e 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,2 +1,2 @@ -include ':jsocksAndroid', ':orbotservice', ':RootCommands' +include ':jsocksAndroid', ':orbotservice' include ':app'