fixes for sharing preferences across processes
This commit is contained in:
parent
9a10cdda9d
commit
e632b3b04f
|
@ -7,6 +7,7 @@ import java.util.Locale;
|
|||
|
||||
import org.torproject.android.service.ITorService;
|
||||
import org.torproject.android.service.ITorServiceCallback;
|
||||
import org.torproject.android.service.TorService;
|
||||
import org.torproject.android.service.TorServiceConstants;
|
||||
import org.torproject.android.settings.ProcessSettingsAsyncTask;
|
||||
import org.torproject.android.settings.SettingsPreferences;
|
||||
|
@ -81,12 +82,6 @@ public class Orbot extends SherlockActivity implements TorConstants, OnLongClick
|
|||
|
||||
SharedPreferences mPrefs;
|
||||
|
||||
public static Orbot currentInstance = null;
|
||||
|
||||
private static void setCurrent(Orbot current){
|
||||
Orbot.currentInstance = current;
|
||||
}
|
||||
|
||||
/** Called when the activity is first created. */
|
||||
public void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
|
@ -103,11 +98,9 @@ public class Orbot extends SherlockActivity implements TorConstants, OnLongClick
|
|||
}
|
||||
*/
|
||||
|
||||
mPrefs = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
|
||||
mPrefs = getPrefs();
|
||||
mPrefs.registerOnSharedPreferenceChangeListener(this);
|
||||
|
||||
Orbot.setCurrent(this);
|
||||
|
||||
//if Tor binary is not running, then start the service up
|
||||
//might want to look at whether we need to call this every time
|
||||
//or whether binding to the service is enough
|
||||
|
@ -164,7 +157,7 @@ public class Orbot extends SherlockActivity implements TorConstants, OnLongClick
|
|||
public boolean onLongClick(View v) {
|
||||
ClipboardManager cm = (ClipboardManager)getSystemService(Context.CLIPBOARD_SERVICE);
|
||||
cm.setText(mTxtOrbotLog.getText());
|
||||
Toast.makeText(Orbot.this, "LOG COPIED TO CLIPBOARD. PLEASE EMAIL TO help@guardianproject.info TO DEBUG PROBLEM", Toast.LENGTH_SHORT).show();
|
||||
Toast.makeText(Orbot.this, "LOG COPIED TO CLIPBOARD", Toast.LENGTH_SHORT).show();
|
||||
return true;
|
||||
}
|
||||
});
|
||||
|
@ -1265,4 +1258,9 @@ public class Orbot extends SherlockActivity implements TorConstants, OnLongClick
|
|||
|
||||
}
|
||||
|
||||
private SharedPreferences getPrefs ()
|
||||
{
|
||||
return TorService.getSharedPrefs(getApplicationContext());
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
@ -52,5 +52,5 @@ public interface TorConstants {
|
|||
|
||||
public final static String PREF_DISABLE_NETWORK = "pref_disable_network";
|
||||
|
||||
public final static String PREF_TOR_SHARED_PREFS = "torprefs";
|
||||
public final static String PREF_TOR_SHARED_PREFS = "org.torproject.android_preferences";
|
||||
}
|
||||
|
|
|
@ -44,13 +44,12 @@ import android.content.Intent;
|
|||
import android.content.IntentFilter;
|
||||
import android.content.SharedPreferences;
|
||||
import android.content.SharedPreferences.Editor;
|
||||
import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
|
||||
import android.net.ConnectivityManager;
|
||||
import android.net.Uri;
|
||||
import android.os.Build;
|
||||
import android.os.IBinder;
|
||||
import android.os.RemoteCallbackList;
|
||||
import android.os.RemoteException;
|
||||
import android.preference.PreferenceManager;
|
||||
import android.support.v4.app.NotificationCompat;
|
||||
import android.util.Log;
|
||||
|
||||
|
@ -249,23 +248,8 @@ public class TorService extends Service implements TorServiceConstants, TorConst
|
|||
super.onStart(intent, startId);
|
||||
|
||||
_torInstance = this;
|
||||
|
||||
/*
|
||||
prefs = getSharedPreferences(TorConstants.PREF_TOR_SHARED_PREFS,Context.MODE_MULTI_PROCESS);
|
||||
*/
|
||||
|
||||
/*
|
||||
mPrefs.registerOnSharedPreferenceChangeListener(new OnSharedPreferenceChangeListener()
|
||||
{
|
||||
|
||||
@Override
|
||||
public void onSharedPreferenceChanged(
|
||||
SharedPreferences sharedPreferences, String key) {
|
||||
updateSettings();
|
||||
|
||||
}
|
||||
|
||||
});*/
|
||||
android.os.Debug.waitForDebugger();
|
||||
|
||||
initTorPaths();
|
||||
|
||||
|
@ -297,7 +281,7 @@ public class TorService extends Service implements TorServiceConstants, TorConst
|
|||
if (intent != null && intent.getAction()!=null && intent.getAction().equals("onboot"))
|
||||
{
|
||||
|
||||
boolean startOnBoot = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()).getBoolean("pref_start_boot",false);
|
||||
boolean startOnBoot = getSharedPrefs(getApplicationContext()).getBoolean("pref_start_boot",false);
|
||||
|
||||
if (startOnBoot)
|
||||
{
|
||||
|
@ -305,6 +289,16 @@ public class TorService extends Service implements TorServiceConstants, TorConst
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static SharedPreferences getSharedPrefs (Context context)
|
||||
{
|
||||
if (Build.VERSION.SDK_INT>=11)
|
||||
return context.getSharedPreferences(TorConstants.PREF_TOR_SHARED_PREFS,Context.MODE_MULTI_PROCESS);
|
||||
else
|
||||
return context.getSharedPreferences(TorConstants.PREF_TOR_SHARED_PREFS,Context.MODE_PRIVATE);
|
||||
|
||||
}
|
||||
|
||||
|
||||
public void run ()
|
||||
{
|
||||
|
@ -366,7 +360,7 @@ public class TorService extends Service implements TorServiceConstants, TorConst
|
|||
{
|
||||
currentStatus = STATUS_OFF;
|
||||
|
||||
boolean hasRoot = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()).getBoolean(PREF_HAS_ROOT,false);
|
||||
boolean hasRoot = getSharedPrefs(getApplicationContext()).getBoolean("has_root", false);
|
||||
|
||||
try
|
||||
{
|
||||
|
@ -424,7 +418,7 @@ public class TorService extends Service implements TorServiceConstants, TorConst
|
|||
private String getHiddenServiceHostname ()
|
||||
{
|
||||
|
||||
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
|
||||
SharedPreferences prefs = getSharedPrefs(getApplicationContext());
|
||||
|
||||
boolean enableHiddenServices = prefs.getBoolean("pref_hs_enable", false);
|
||||
|
||||
|
@ -547,7 +541,7 @@ public class TorService extends Service implements TorServiceConstants, TorConst
|
|||
public boolean checkTorBinaries (boolean forceInstall) throws Exception
|
||||
{
|
||||
|
||||
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
|
||||
SharedPreferences prefs =getSharedPrefs(getApplicationContext());
|
||||
|
||||
//check and install iptables
|
||||
TorBinaryInstaller.assertIpTablesBinaries(this, true);
|
||||
|
@ -651,7 +645,7 @@ public class TorService extends Service implements TorServiceConstants, TorConst
|
|||
|
||||
private void updateSettings ()
|
||||
{
|
||||
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
|
||||
SharedPreferences prefs = getSharedPrefs(getApplicationContext());
|
||||
|
||||
mHasRoot = prefs.getBoolean(PREF_HAS_ROOT,false);
|
||||
mEnableTransparentProxy = prefs.getBoolean("pref_transparent", false);
|
||||
|
@ -666,6 +660,7 @@ public class TorService extends Service implements TorServiceConstants, TorConst
|
|||
|
||||
public void initTor () throws Exception
|
||||
{
|
||||
android.os.Debug.waitForDebugger();
|
||||
|
||||
updateSettings ();
|
||||
|
||||
|
@ -725,7 +720,7 @@ public class TorService extends Service implements TorServiceConstants, TorConst
|
|||
{
|
||||
showToolbarNotification(getString(R.string.setting_up_app_based_transparent_proxying_), TRANSPROXY_NOTIFY_ID, R.drawable.ic_stat_tor, -1);
|
||||
|
||||
code = mTransProxy.setTransparentProxyingByApp(this,AppManager.getApps(this));
|
||||
code = mTransProxy.setTransparentProxyingByApp(this,AppManager.getApps(this, getSharedPrefs(getApplicationContext())));
|
||||
}
|
||||
|
||||
|
||||
|
@ -767,7 +762,7 @@ public class TorService extends Service implements TorServiceConstants, TorConst
|
|||
mTransProxy = new TorTransProxy(this);
|
||||
|
||||
mTransProxy.clearTransparentProxyingAll(this);
|
||||
mTransProxy.clearTransparentProxyingByApp(this,AppManager.getApps(this));
|
||||
// mTransProxy.clearTransparentProxyingByApp(this,AppManager.getApps(this));
|
||||
|
||||
clearNotifications();
|
||||
|
||||
|
@ -776,7 +771,7 @@ public class TorService extends Service implements TorServiceConstants, TorConst
|
|||
|
||||
private void runTorShellCmd() throws Exception
|
||||
{
|
||||
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
|
||||
SharedPreferences prefs =getSharedPrefs(getApplicationContext());
|
||||
|
||||
StringBuilder log = new StringBuilder();
|
||||
|
||||
|
@ -1083,6 +1078,12 @@ public class TorService extends Service implements TorServiceConstants, TorConst
|
|||
|
||||
}
|
||||
|
||||
if (mNotificationManager == null)
|
||||
{
|
||||
mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
|
||||
|
||||
}
|
||||
|
||||
mNotifyBuilder.setOngoing(persistent);
|
||||
mNotifyBuilder.setContentText(message);
|
||||
|
||||
|
@ -1235,28 +1236,32 @@ public class TorService extends Service implements TorServiceConstants, TorConst
|
|||
|
||||
public void circuitStatus(String status, String circID, String path) {
|
||||
|
||||
StringBuilder sb = new StringBuilder();
|
||||
sb.append("Circuit (");
|
||||
sb.append((circID));
|
||||
sb.append(") ");
|
||||
sb.append(status);
|
||||
sb.append(": ");
|
||||
|
||||
StringTokenizer st = new StringTokenizer(path,",");
|
||||
String node = null;
|
||||
|
||||
while (st.hasMoreTokens())
|
||||
if (status.equals("BUILT") || status.equals("CLOSED"))
|
||||
{
|
||||
node = st.nextToken();
|
||||
StringBuilder sb = new StringBuilder();
|
||||
sb.append("Circuit (");
|
||||
sb.append((circID));
|
||||
sb.append(") ");
|
||||
sb.append(status);
|
||||
sb.append(": ");
|
||||
|
||||
sb.append(parseNodeName(node));
|
||||
StringTokenizer st = new StringTokenizer(path,",");
|
||||
String node = null;
|
||||
|
||||
while (st.hasMoreTokens())
|
||||
{
|
||||
node = st.nextToken();
|
||||
|
||||
sb.append(parseNodeName(node));
|
||||
|
||||
|
||||
if (st.hasMoreTokens())
|
||||
sb.append (" > ");
|
||||
}
|
||||
|
||||
if (st.hasMoreTokens())
|
||||
sb.append (" > ");
|
||||
logNotice(sb.toString());
|
||||
}
|
||||
|
||||
logNotice(sb.toString());
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
@ -1618,7 +1623,7 @@ public class TorService extends Service implements TorServiceConstants, TorConst
|
|||
@Override
|
||||
public void onReceive(Context context, Intent intent) {
|
||||
|
||||
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
|
||||
SharedPreferences prefs = getSharedPrefs(getApplicationContext());
|
||||
|
||||
mConnectivity = !intent.getBooleanExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY, false);
|
||||
|
||||
|
@ -1650,7 +1655,7 @@ public class TorService extends Service implements TorServiceConstants, TorConst
|
|||
|
||||
private boolean processSettingsImpl () throws RemoteException
|
||||
{
|
||||
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
|
||||
SharedPreferences prefs = getSharedPrefs(getApplicationContext());
|
||||
|
||||
boolean useBridges = prefs.getBoolean(TorConstants.PREF_BRIDGES_ENABLED, false);
|
||||
|
||||
|
|
|
@ -132,7 +132,8 @@ public class TorServiceUtils implements TorServiceConstants {
|
|||
|
||||
for (int i = 0; i < cmds.length; i++)
|
||||
{
|
||||
// TorService.logMessage("executing shell cmd: " + cmds[i] + "; runAsRoot=" + runAsRoot + ";waitFor=" + waitFor);
|
||||
if (TorService.ENABLE_DEBUG_LOG)
|
||||
Log.d(TorService.TAG,"executing shell cmd: " + cmds[i] + "; runAsRoot=" + runAsRoot + ";waitFor=" + waitFor);
|
||||
|
||||
out.write(cmds[i]);
|
||||
out.write("\n");
|
||||
|
@ -169,4 +170,54 @@ public class TorServiceUtils implements TorServiceConstants {
|
|||
return exitCode;
|
||||
|
||||
}
|
||||
|
||||
public static int doShellCommand(String cmd, StringBuilder log, boolean runAsRoot, boolean waitFor) throws Exception
|
||||
{
|
||||
|
||||
Process proc = null;
|
||||
int exitCode = -1;
|
||||
|
||||
if (runAsRoot)
|
||||
proc = Runtime.getRuntime().exec("su");
|
||||
else
|
||||
proc = Runtime.getRuntime().exec("sh");
|
||||
|
||||
OutputStreamWriter out = new OutputStreamWriter(proc.getOutputStream());
|
||||
|
||||
// TorService.logMessage("executing shell cmd: " + cmds[i] + "; runAsRoot=" + runAsRoot + ";waitFor=" + waitFor);
|
||||
|
||||
out.write(cmd);
|
||||
out.write("\n");
|
||||
|
||||
|
||||
out.flush();
|
||||
out.write("exit\n");
|
||||
out.flush();
|
||||
|
||||
if (waitFor)
|
||||
{
|
||||
|
||||
final char buf[] = new char[10];
|
||||
|
||||
// Consume the "stdout"
|
||||
InputStreamReader reader = new InputStreamReader(proc.getInputStream());
|
||||
int read=0;
|
||||
while ((read=reader.read(buf)) != -1) {
|
||||
if (log != null) log.append(buf, 0, read);
|
||||
}
|
||||
|
||||
// Consume the "stderr"
|
||||
reader = new InputStreamReader(proc.getErrorStream());
|
||||
read=0;
|
||||
while ((read=reader.read(buf)) != -1) {
|
||||
if (log != null) log.append(buf, 0, read);
|
||||
}
|
||||
|
||||
exitCode = proc.waitFor();
|
||||
|
||||
}
|
||||
|
||||
return exitCode;
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
@ -31,7 +31,8 @@ public class TorTransProxy implements TorServiceConstants {
|
|||
|
||||
String ipTablesPath = null;
|
||||
|
||||
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context.getApplicationContext());
|
||||
SharedPreferences prefs = TorService.getSharedPrefs(context.getApplicationContext());
|
||||
|
||||
useSystemIpTables = prefs.getBoolean(TorConstants.PREF_USE_SYSTEM_IPTABLES, false);
|
||||
|
||||
if (useSystemIpTables)
|
||||
|
@ -233,7 +234,7 @@ public class TorTransProxy implements TorServiceConstants {
|
|||
}
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
public int clearTransparentProxyingByApp (Context context, ArrayList<TorifiedApp> apps) throws Exception
|
||||
{
|
||||
boolean runRoot = true;
|
||||
|
@ -270,7 +271,7 @@ public class TorTransProxy implements TorServiceConstants {
|
|||
logMessage(cmdAdd[0] + ";errCode=" + code + ";resp=" + msg);
|
||||
|
||||
return code;
|
||||
}
|
||||
}*/
|
||||
|
||||
public int setTransparentProxyingByApp(Context context, ArrayList<TorifiedApp> apps) throws Exception
|
||||
{
|
||||
|
@ -285,21 +286,8 @@ public class TorTransProxy implements TorServiceConstants {
|
|||
StringBuilder res = new StringBuilder();
|
||||
int code = -1;
|
||||
|
||||
String chainName = "ORBOT";
|
||||
String jumpChainName = "OUTPUT";
|
||||
String srcChainName = "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");
|
||||
|
||||
//run the delete commands in a separate process as it might error out
|
||||
String[] cmdExecClear = {script.toString()};
|
||||
|
@ -307,16 +295,7 @@ public class TorTransProxy implements TorServiceConstants {
|
|||
|
||||
//reset script
|
||||
script = new StringBuilder();
|
||||
|
||||
script.append(ipTablesPath);
|
||||
script.append(" -N ").append(chainName); //create user-defined chain
|
||||
script.append(" || exit\n");
|
||||
|
||||
script.append(ipTablesPath);
|
||||
script.append(" -A ").append(jumpChainName);
|
||||
script.append(" -j ").append(chainName);
|
||||
script.append(" || exit\n");
|
||||
|
||||
|
||||
//build up array of shell cmds to execute under one root context
|
||||
for (TorifiedApp tApp:apps)
|
||||
{
|
||||
|
@ -332,7 +311,7 @@ public class TorTransProxy implements TorServiceConstants {
|
|||
// Set up port redirection
|
||||
script.append(ipTablesPath);
|
||||
script.append(" -t nat");
|
||||
script.append(" -A ").append(jumpChainName);
|
||||
script.append(" -A ").append(srcChainName);
|
||||
script.append(" -p tcp");
|
||||
script.append(" ! -d 127.0.0.1"); //allow access to localhost
|
||||
script.append(" -m owner --uid-owner ");
|
||||
|
@ -345,7 +324,7 @@ public class TorTransProxy implements TorServiceConstants {
|
|||
// Same for DNS
|
||||
script.append(ipTablesPath);
|
||||
script.append(" -t nat");
|
||||
script.append(" -A ").append(jumpChainName);
|
||||
script.append(" -A ").append(srcChainName);
|
||||
script.append(" -p udp -m owner --uid-owner ");
|
||||
script.append(tApp.getUid());
|
||||
script.append(" -m udp --dport ");
|
||||
|
@ -361,7 +340,7 @@ public class TorTransProxy implements TorServiceConstants {
|
|||
// Allow packets to localhost (contains all the port-redirected ones)
|
||||
script.append(ipTablesPath);
|
||||
script.append(" -t filter");
|
||||
script.append(" -A ").append(jumpChainName);
|
||||
script.append(" -A ").append(srcChainName);
|
||||
script.append(" -m owner --uid-owner ");
|
||||
script.append(tApp.getUid());
|
||||
script.append(" -p tcp");
|
||||
|
@ -375,7 +354,7 @@ public class TorTransProxy implements TorServiceConstants {
|
|||
// Allow loopback
|
||||
script.append(ipTablesPath);
|
||||
script.append(" -t filter");
|
||||
script.append(" -A ").append(jumpChainName);
|
||||
script.append(" -A ").append(srcChainName);
|
||||
script.append(" -m owner --uid-owner ");
|
||||
script.append(tApp.getUid());
|
||||
script.append(" -p tcp");
|
||||
|
@ -386,7 +365,7 @@ public class TorTransProxy implements TorServiceConstants {
|
|||
// Reject all other outbound TCP packets
|
||||
script.append(ipTablesPath);
|
||||
script.append(" -t filter");
|
||||
script.append(" -A ").append(jumpChainName);
|
||||
script.append(" -A ").append(srcChainName);
|
||||
script.append(" -m owner --uid-owner ");
|
||||
script.append(tApp.getUid());
|
||||
script.append(" -p tcp");
|
||||
|
@ -397,7 +376,7 @@ public class TorTransProxy implements TorServiceConstants {
|
|||
// Reject all other outbound UDP packets
|
||||
script.append(ipTablesPath);
|
||||
script.append(" -t filter");
|
||||
script.append(" -A ").append(jumpChainName);
|
||||
script.append(" -A ").append(srcChainName);
|
||||
script.append(" -m owner --uid-owner ");
|
||||
script.append(tApp.getUid());
|
||||
script.append(" -p udp");
|
||||
|
@ -475,37 +454,31 @@ public class TorTransProxy implements TorServiceConstants {
|
|||
boolean runRoot = true;
|
||||
boolean waitFor = true;
|
||||
|
||||
//redirectDNSResolvConf(); //not working yet
|
||||
|
||||
String ipTablesPath = getIpTablesPath(context);
|
||||
|
||||
StringBuilder script = new StringBuilder();
|
||||
|
||||
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");
|
||||
String chainName = "OUTPUT";
|
||||
|
||||
script = new StringBuilder();
|
||||
res = new StringBuilder();
|
||||
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(" -t nat");
|
||||
script.append(" -F ").append(chainName); //delete previous user-defined chain
|
||||
script.append(" || exit\n");
|
||||
code = TorServiceUtils.doShellCommand(script.toString(), res, runRoot, waitFor);
|
||||
logMessage("Exec resp: cmd> " + script.toString() + "; errCode=" + code + ";resp=" + res.toString());
|
||||
|
||||
String[] cmdExec = {script.toString()};
|
||||
|
||||
code = TorServiceUtils.doShellCommand(cmdExec, res, runRoot, waitFor);
|
||||
String msg = res.toString();
|
||||
|
||||
logMessage("Exec resp: errCode=" + code + ";resp=" + msg);
|
||||
script = new StringBuilder();
|
||||
res = new StringBuilder();
|
||||
script.append(ipTablesPath);
|
||||
script.append(" -t filter");
|
||||
script.append(" -F ").append(chainName); //delete previous user-defined chain
|
||||
script.append(" || exit\n");
|
||||
code = TorServiceUtils.doShellCommand(script.toString(), res, runRoot, waitFor);
|
||||
logMessage("Exec resp: cmd> " + script.toString() + "; errCode=" + code + ";resp=" + res.toString());
|
||||
|
||||
return code;
|
||||
}
|
||||
|
@ -527,51 +500,21 @@ public class TorTransProxy implements TorServiceConstants {
|
|||
|
||||
int torUid = context.getApplicationInfo().uid;
|
||||
|
||||
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");
|
||||
|
||||
//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
|
||||
script = new StringBuilder();
|
||||
|
||||
script.append(ipTablesPath);
|
||||
script.append(" -N ").append(chainName); //create user-defined chain
|
||||
script.append(" || exit\n");
|
||||
|
||||
script.append(ipTablesPath);
|
||||
script.append(" -A ").append(jumpChainName);
|
||||
script.append(" -j ").append(chainName);
|
||||
script.append(" || exit\n");
|
||||
String srcChainName = "OUTPUT";
|
||||
|
||||
// Allow everything for Tor
|
||||
script.append(ipTablesPath);
|
||||
script.append(ipTablesPath);
|
||||
script.append(" -t filter");
|
||||
script.append(" -A ").append(chainName);
|
||||
script.append(" -A ").append(srcChainName);
|
||||
script.append(" -m owner --uid-owner ");
|
||||
script.append(torUid);
|
||||
script.append(" -j ACCEPT");
|
||||
script.append(" || exit\n");
|
||||
|
||||
// Set up port redirection
|
||||
script.append(ipTablesPath);
|
||||
script.append(ipTablesPath);
|
||||
script.append(" -t nat");
|
||||
script.append(" -A ").append(jumpChainName);
|
||||
script.append(" -A ").append(srcChainName);
|
||||
script.append(" -p tcp");
|
||||
script.append(" ! -d 127.0.0.1"); //allow access to localhost
|
||||
script.append(" -m owner ! --uid-owner ");
|
||||
|
@ -584,7 +527,7 @@ public class TorTransProxy implements TorServiceConstants {
|
|||
// Same for DNS
|
||||
script.append(ipTablesPath);
|
||||
script.append(" -t nat");
|
||||
script.append(" -A ").append(jumpChainName);
|
||||
script.append(" -A ").append(srcChainName);
|
||||
script.append(" -p udp -m owner ! --uid-owner ");
|
||||
script.append(torUid);
|
||||
script.append(" -m udp --dport ");
|
||||
|
@ -598,9 +541,9 @@ public class TorTransProxy implements TorServiceConstants {
|
|||
for (int port : ports)
|
||||
{
|
||||
// Allow packets to localhost (contains all the port-redirected ones)
|
||||
script.append(ipTablesPath);
|
||||
script.append(ipTablesPath);
|
||||
script.append(" -t filter");
|
||||
script.append(" -A ").append(chainName);
|
||||
script.append(" -A ").append(srcChainName);
|
||||
script.append(" -m owner ! --uid-owner ");
|
||||
script.append(torUid);
|
||||
script.append(" -p tcp");
|
||||
|
@ -615,7 +558,7 @@ public class TorTransProxy implements TorServiceConstants {
|
|||
// Allow loopback
|
||||
script.append(ipTablesPath);
|
||||
script.append(" -t filter");
|
||||
script.append(" -A ").append(chainName);
|
||||
script.append(" -A ").append(srcChainName);
|
||||
script.append(" -p tcp");
|
||||
script.append(" -o lo");
|
||||
script.append(" -j ACCEPT");
|
||||
|
@ -625,9 +568,9 @@ public class TorTransProxy implements TorServiceConstants {
|
|||
if (TorService.ENABLE_DEBUG_LOG)
|
||||
{
|
||||
//XXX: Comment the following rules for non-debug builds
|
||||
script.append(ipTablesPath);
|
||||
script.append(ipTablesPath);
|
||||
script.append(" -t filter");
|
||||
script.append(" -A ").append(chainName);
|
||||
script.append(" -A ").append(srcChainName);
|
||||
script.append(" -p udp");
|
||||
script.append(" --dport ");
|
||||
script.append(STANDARD_DNS_PORT);
|
||||
|
@ -636,9 +579,9 @@ public class TorTransProxy implements TorServiceConstants {
|
|||
script.append(" --log-uid");
|
||||
script.append(" || exit\n");
|
||||
|
||||
script.append(ipTablesPath);
|
||||
script.append(ipTablesPath);
|
||||
script.append(" -t filter");
|
||||
script.append(" -A ").append(chainName);
|
||||
script.append(" -A ").append(srcChainName);
|
||||
script.append(" -p tcp");
|
||||
script.append(" -j LOG");
|
||||
script.append(" --log-prefix='ORBOT_TCPLEAK_PROTECTION'");
|
||||
|
@ -650,7 +593,7 @@ public class TorTransProxy implements TorServiceConstants {
|
|||
// Reject all other outbound TCP packets
|
||||
script.append(ipTablesPath);
|
||||
script.append(" -t filter");
|
||||
script.append(" -A ").append(chainName);
|
||||
script.append(" -A ").append(srcChainName);
|
||||
script.append(" -m owner ! --uid-owner ");
|
||||
script.append(torUid);
|
||||
script.append(" -p tcp");
|
||||
|
@ -661,7 +604,7 @@ public class TorTransProxy implements TorServiceConstants {
|
|||
// Reject all other outbound UDP packets
|
||||
script.append(ipTablesPath);
|
||||
script.append(" -t filter");
|
||||
script.append(" -A ").append(chainName);
|
||||
script.append(" -A ").append(srcChainName);
|
||||
script.append(" -m owner ! --uid-owner ");
|
||||
script.append(torUid);
|
||||
script.append(" -p udp");
|
||||
|
|
|
@ -6,12 +6,14 @@ package org.torproject.android.settings;
|
|||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.Comparator;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.StringTokenizer;
|
||||
|
||||
import org.torproject.android.R;
|
||||
import org.torproject.android.TorConstants;
|
||||
import org.torproject.android.service.TorService;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.content.Context;
|
||||
|
@ -21,7 +23,6 @@ import android.content.pm.ApplicationInfo;
|
|||
import android.content.pm.PackageInfo;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.os.Bundle;
|
||||
import android.preference.PreferenceManager;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.View.OnClickListener;
|
||||
|
@ -36,24 +37,15 @@ import android.widget.ListAdapter;
|
|||
import android.widget.ListView;
|
||||
import android.widget.TextView;
|
||||
|
||||
|
||||
public class AppManager extends Activity implements OnCheckedChangeListener, OnClickListener, TorConstants {
|
||||
|
||||
private static ArrayList<TorifiedApp> apps = null;
|
||||
|
||||
private ListView listApps;
|
||||
|
||||
private AppManager mAppManager;
|
||||
|
||||
|
||||
private boolean appsLoaded = false;
|
||||
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
|
||||
this.setContentView(R.layout.layout_apps);
|
||||
|
||||
mAppManager = this;
|
||||
|
||||
}
|
||||
|
||||
|
@ -73,16 +65,17 @@ public class AppManager extends Activity implements OnCheckedChangeListener, OnC
|
|||
}
|
||||
});
|
||||
|
||||
if (!appsLoaded)
|
||||
loadApps();
|
||||
mPrefs = TorService.getSharedPrefs(getApplicationContext());
|
||||
loadApps(mPrefs);
|
||||
}
|
||||
|
||||
|
||||
|
||||
private void loadApps ()
|
||||
SharedPreferences mPrefs = null;
|
||||
ArrayList<TorifiedApp> mApps = null;
|
||||
|
||||
private void loadApps (SharedPreferences prefs)
|
||||
{
|
||||
resetApps(this);
|
||||
final ArrayList<TorifiedApp> apps = getApps(this);
|
||||
|
||||
mApps = getApps(getApplicationContext(), prefs);
|
||||
|
||||
/*
|
||||
Arrays.sort(apps, new Comparator<TorifiedApp>() {
|
||||
|
@ -91,12 +84,11 @@ public class AppManager extends Activity implements OnCheckedChangeListener, OnC
|
|||
if (o1.isTorified()) return -1;
|
||||
return 1;
|
||||
}
|
||||
});
|
||||
*/
|
||||
});*/
|
||||
|
||||
final LayoutInflater inflater = getLayoutInflater();
|
||||
|
||||
final ListAdapter adapter = new ArrayAdapter<TorifiedApp>(this,R.layout.layout_apps_item,R.id.itemtext,apps) {
|
||||
ListAdapter adapter = new ArrayAdapter<TorifiedApp>(this,R.layout.layout_apps_item,R.id.itemtext,mApps) {
|
||||
public View getView(int position, View convertView, ViewGroup parent) {
|
||||
ListEntry entry;
|
||||
if (convertView == null) {
|
||||
|
@ -107,19 +99,19 @@ public class AppManager extends Activity implements OnCheckedChangeListener, OnC
|
|||
entry.box = (CheckBox) convertView.findViewById(R.id.itemcheck);
|
||||
entry.text = (TextView) convertView.findViewById(R.id.itemtext);
|
||||
|
||||
entry.text.setOnClickListener(mAppManager);
|
||||
entry.text.setOnClickListener(mAppManager);
|
||||
entry.text.setOnClickListener(AppManager.this);
|
||||
entry.text.setOnClickListener(AppManager.this);
|
||||
|
||||
convertView.setTag(entry);
|
||||
|
||||
entry.box.setOnCheckedChangeListener(mAppManager);
|
||||
entry.box.setOnCheckedChangeListener(AppManager.this);
|
||||
} else {
|
||||
// Convert an existing view
|
||||
entry = (ListEntry) convertView.getTag();
|
||||
}
|
||||
|
||||
|
||||
final TorifiedApp app = apps.get(position);
|
||||
final TorifiedApp app = mApps.get(position);
|
||||
|
||||
|
||||
entry.icon.setImageDrawable(app.getIcon());
|
||||
|
@ -138,8 +130,6 @@ public class AppManager extends Activity implements OnCheckedChangeListener, OnC
|
|||
|
||||
listApps.setAdapter(adapter);
|
||||
|
||||
appsLoaded = true;
|
||||
|
||||
}
|
||||
|
||||
private static class ListEntry {
|
||||
|
@ -157,19 +147,10 @@ public class AppManager extends Activity implements OnCheckedChangeListener, OnC
|
|||
|
||||
}
|
||||
|
||||
public static ArrayList<TorifiedApp> getApps (Context context)
|
||||
{
|
||||
if (apps == null)
|
||||
resetApps(context);
|
||||
|
||||
return apps;
|
||||
}
|
||||
|
||||
public static ArrayList<TorifiedApp> resetApps (Context context)
|
||||
public static ArrayList<TorifiedApp> getApps (Context context, SharedPreferences prefs)
|
||||
{
|
||||
|
||||
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
|
||||
|
||||
String tordAppString = prefs.getString(PREFS_KEY_TORIFIED, "");
|
||||
String[] tordApps;
|
||||
|
||||
|
@ -190,7 +171,7 @@ public class AppManager extends Activity implements OnCheckedChangeListener, OnC
|
|||
|
||||
Iterator<ApplicationInfo> itAppInfo = lAppInfo.iterator();
|
||||
|
||||
apps = new ArrayList<TorifiedApp>();
|
||||
ArrayList<TorifiedApp> apps = new ArrayList<TorifiedApp>();
|
||||
|
||||
ApplicationInfo aInfo = null;
|
||||
|
||||
|
@ -269,16 +250,10 @@ public class AppManager extends Activity implements OnCheckedChangeListener, OnC
|
|||
|
||||
public void saveAppSettings (Context context)
|
||||
{
|
||||
if (apps == null)
|
||||
return;
|
||||
|
||||
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
|
||||
|
||||
// final SharedPreferences prefs = context.getSharedPreferences(PREFS_KEY, 0);
|
||||
|
||||
StringBuilder tordApps = new StringBuilder();
|
||||
|
||||
for (TorifiedApp tApp:apps)
|
||||
|
||||
for (TorifiedApp tApp:mApps)
|
||||
{
|
||||
if (tApp.isTorified())
|
||||
{
|
||||
|
@ -287,7 +262,7 @@ public class AppManager extends Activity implements OnCheckedChangeListener, OnC
|
|||
}
|
||||
}
|
||||
|
||||
Editor edit = prefs.edit();
|
||||
Editor edit = mPrefs.edit();
|
||||
edit.putString(PREFS_KEY_TORIFIED, tordApps.toString());
|
||||
edit.commit();
|
||||
|
||||
|
|
Loading…
Reference in New Issue