ensure existing binaries are removed before install
problems may be caused by soft links or old bins
This commit is contained in:
parent
ef14ac5c3e
commit
b6a9b48e77
|
@ -3,19 +3,21 @@
|
||||||
|
|
||||||
package org.torproject.android.service;
|
package org.torproject.android.service;
|
||||||
|
|
||||||
import java.io.BufferedReader;
|
|
||||||
import java.io.DataInputStream;
|
import java.io.DataInputStream;
|
||||||
import java.io.DataOutputStream;
|
import java.io.DataOutputStream;
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.FileNotFoundException;
|
import java.io.FileNotFoundException;
|
||||||
import java.io.FileOutputStream;
|
import java.io.FileOutputStream;
|
||||||
import java.io.FileReader;
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.io.OutputStream;
|
import java.io.OutputStream;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.concurrent.TimeoutException;
|
||||||
import java.util.zip.ZipEntry;
|
import java.util.zip.ZipEntry;
|
||||||
import java.util.zip.ZipInputStream;
|
import java.util.zip.ZipInputStream;
|
||||||
|
|
||||||
|
import org.sufficientlysecure.rootcommands.Shell;
|
||||||
|
import org.sufficientlysecure.rootcommands.command.SimpleCommand;
|
||||||
import org.torproject.android.R;
|
import org.torproject.android.R;
|
||||||
import org.torproject.android.TorConstants;
|
import org.torproject.android.TorConstants;
|
||||||
|
|
||||||
|
@ -39,7 +41,7 @@ public class TorResourceInstaller implements TorServiceConstants {
|
||||||
/*
|
/*
|
||||||
* Extract the Tor resources from the APK file using ZIP
|
* Extract the Tor resources from the APK file using ZIP
|
||||||
*/
|
*/
|
||||||
public boolean installResources () throws IOException, FileNotFoundException
|
public boolean installResources () throws IOException, FileNotFoundException, TimeoutException
|
||||||
{
|
{
|
||||||
|
|
||||||
InputStream is;
|
InputStream is;
|
||||||
|
@ -48,32 +50,48 @@ public class TorResourceInstaller implements TorServiceConstants {
|
||||||
if (!installFolder.exists())
|
if (!installFolder.exists())
|
||||||
installFolder.mkdirs();
|
installFolder.mkdirs();
|
||||||
|
|
||||||
|
Shell shell = Shell.startShell(new ArrayList<String>(),installFolder.getCanonicalPath());
|
||||||
|
|
||||||
is = context.getResources().openRawResource(R.raw.torrc);
|
is = context.getResources().openRawResource(R.raw.torrc);
|
||||||
outFile = new File(installFolder, TORRC_ASSET_KEY);
|
outFile = new File(installFolder, TORRC_ASSET_KEY);
|
||||||
|
if (outFile.exists())
|
||||||
|
shell.add(new SimpleCommand("rm " + outFile.getCanonicalPath())).waitForFinish();
|
||||||
streamToFile(is,outFile, false, false);
|
streamToFile(is,outFile, false, false);
|
||||||
|
|
||||||
is = context.getResources().openRawResource(R.raw.torrctether);
|
is = context.getResources().openRawResource(R.raw.torrctether);
|
||||||
outFile = new File(installFolder, TORRC_TETHER_KEY);
|
outFile = new File(installFolder, TORRC_TETHER_KEY);
|
||||||
|
if (outFile.exists())
|
||||||
|
shell.add(new SimpleCommand("rm " + outFile.getCanonicalPath())).waitForFinish();
|
||||||
streamToFile(is, outFile, false, false);
|
streamToFile(is, outFile, false, false);
|
||||||
|
|
||||||
is = context.getResources().openRawResource(R.raw.privoxy_config);
|
is = context.getResources().openRawResource(R.raw.privoxy_config);
|
||||||
outFile = new File(installFolder, PRIVOXYCONFIG_ASSET_KEY);
|
outFile = new File(installFolder, PRIVOXYCONFIG_ASSET_KEY);
|
||||||
|
if (outFile.exists())
|
||||||
|
shell.add(new SimpleCommand("rm " + outFile.getCanonicalPath())).waitForFinish();
|
||||||
streamToFile(is,outFile, false, false);
|
streamToFile(is,outFile, false, false);
|
||||||
|
|
||||||
is = context.getResources().openRawResource(R.raw.tor);
|
is = context.getResources().openRawResource(R.raw.tor);
|
||||||
outFile = new File(installFolder, TOR_ASSET_KEY);
|
outFile = new File(installFolder, TOR_ASSET_KEY);
|
||||||
|
if (outFile.exists())
|
||||||
|
shell.add(new SimpleCommand("rm " + outFile.getCanonicalPath())).waitForFinish();
|
||||||
streamToFile(is,outFile, false, true);
|
streamToFile(is,outFile, false, true);
|
||||||
|
|
||||||
is = context.getResources().openRawResource(R.raw.privoxy);
|
is = context.getResources().openRawResource(R.raw.privoxy);
|
||||||
outFile = new File(installFolder, PRIVOXY_ASSET_KEY);
|
outFile = new File(installFolder, PRIVOXY_ASSET_KEY);
|
||||||
|
if (outFile.exists())
|
||||||
|
shell.add(new SimpleCommand("rm " + outFile.getCanonicalPath())).waitForFinish();
|
||||||
streamToFile(is,outFile, false, true);
|
streamToFile(is,outFile, false, true);
|
||||||
|
|
||||||
is = context.getResources().openRawResource(R.raw.obfsproxy);
|
is = context.getResources().openRawResource(R.raw.obfsproxy);
|
||||||
outFile = new File(installFolder, OBFSPROXY_ASSET_KEY);
|
outFile = new File(installFolder, OBFSPROXY_ASSET_KEY);
|
||||||
|
if (outFile.exists())
|
||||||
|
shell.add(new SimpleCommand("rm " + outFile.getCanonicalPath())).waitForFinish();
|
||||||
streamToFile(is,outFile, false, true);
|
streamToFile(is,outFile, false, true);
|
||||||
|
|
||||||
is = context.getResources().openRawResource(R.raw.xtables);
|
is = context.getResources().openRawResource(R.raw.xtables);
|
||||||
outFile = new File(installFolder, IPTABLES_ASSET_KEY);
|
outFile = new File(installFolder, IPTABLES_ASSET_KEY);
|
||||||
|
if (outFile.exists())
|
||||||
|
shell.add(new SimpleCommand("rm " + outFile.getCanonicalPath())).waitForFinish();
|
||||||
streamToFile(is,outFile, false, true);
|
streamToFile(is,outFile, false, true);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|
|
@ -25,7 +25,6 @@ import net.freehaven.tor.control.ConfigEntry;
|
||||||
import net.freehaven.tor.control.EventHandler;
|
import net.freehaven.tor.control.EventHandler;
|
||||||
import net.freehaven.tor.control.TorControlConnection;
|
import net.freehaven.tor.control.TorControlConnection;
|
||||||
|
|
||||||
import org.sufficientlysecure.rootcommands.RootCommands;
|
|
||||||
import org.sufficientlysecure.rootcommands.Shell;
|
import org.sufficientlysecure.rootcommands.Shell;
|
||||||
import org.sufficientlysecure.rootcommands.Toolbox;
|
import org.sufficientlysecure.rootcommands.Toolbox;
|
||||||
import org.sufficientlysecure.rootcommands.command.SimpleCommand;
|
import org.sufficientlysecure.rootcommands.command.SimpleCommand;
|
||||||
|
@ -55,7 +54,6 @@ import android.os.RemoteException;
|
||||||
import android.support.v4.app.NotificationCompat;
|
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.Toast;
|
|
||||||
|
|
||||||
public class TorService extends Service implements TorServiceConstants, TorConstants, Runnable, EventHandler
|
public class TorService extends Service implements TorServiceConstants, TorConstants, Runnable, EventHandler
|
||||||
{
|
{
|
||||||
|
@ -528,6 +526,7 @@ public class TorService extends Service implements TorServiceConstants, TorConst
|
||||||
TorResourceInstaller installer = new TorResourceInstaller(this, appBinHome);
|
TorResourceInstaller installer = new TorResourceInstaller(this, appBinHome);
|
||||||
boolean success = installer.installResources();
|
boolean success = installer.installResources();
|
||||||
|
|
||||||
|
if (success)
|
||||||
prefs.edit().putString(PREF_BINARY_TOR_VERSION_INSTALLED,BINARY_TOR_VERSION).commit();
|
prefs.edit().putString(PREF_BINARY_TOR_VERSION_INSTALLED,BINARY_TOR_VERSION).commit();
|
||||||
}
|
}
|
||||||
else if (!fileTorRc.exists())
|
else if (!fileTorRc.exists())
|
||||||
|
@ -537,6 +536,7 @@ public class TorService extends Service implements TorServiceConstants, TorConst
|
||||||
TorResourceInstaller installer = new TorResourceInstaller(this, appBinHome);
|
TorResourceInstaller installer = new TorResourceInstaller(this, appBinHome);
|
||||||
boolean success = installer.installResources();
|
boolean success = installer.installResources();
|
||||||
|
|
||||||
|
if (success)
|
||||||
prefs.edit().putString(PREF_BINARY_TOR_VERSION_INSTALLED,BINARY_TOR_VERSION).commit();
|
prefs.edit().putString(PREF_BINARY_TOR_VERSION_INSTALLED,BINARY_TOR_VERSION).commit();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -556,7 +556,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.getAbsolutePath());
|
Shell shell = Shell.startShell(new ArrayList<String>(), appBinHome.getCanonicalPath());
|
||||||
|
|
||||||
shell.add(new SimpleCommand("chmod " + CHMOD_EXE_VALUE + ' ' + fileBin.getCanonicalPath())).waitForFinish();
|
shell.add(new SimpleCommand("chmod " + CHMOD_EXE_VALUE + ' ' + fileBin.getCanonicalPath())).waitForFinish();
|
||||||
|
|
||||||
|
@ -588,7 +588,16 @@ public class TorService extends Service implements TorServiceConstants, TorConst
|
||||||
public void initTor () throws Exception
|
public void initTor () throws Exception
|
||||||
{
|
{
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
initBinaries();
|
initBinaries();
|
||||||
|
}
|
||||||
|
catch (IOException e)
|
||||||
|
{
|
||||||
|
logNotice("There was a problem installing the Tor binaries: " + e.getLocalizedMessage());
|
||||||
|
Log.d(TAG,"error installing binaries",e);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
updateSettings ();
|
updateSettings ();
|
||||||
|
|
||||||
|
|
|
@ -46,7 +46,7 @@ public interface TorServiceConstants {
|
||||||
|
|
||||||
public final static String CHMOD_EXE_VALUE = "770";
|
public final static String CHMOD_EXE_VALUE = "770";
|
||||||
|
|
||||||
public final static int FILE_WRITE_BUFFER_SIZE = 2048;
|
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 final static int PORT_HTTP = 8118; //just like Privoxy!
|
||||||
|
@ -80,7 +80,7 @@ public interface TorServiceConstants {
|
||||||
public static final int DISABLE_TOR_MSG = 3;
|
public static final int DISABLE_TOR_MSG = 3;
|
||||||
public static final int LOG_MSG = 4;
|
public static final int LOG_MSG = 4;
|
||||||
|
|
||||||
public static final String BINARY_TOR_VERSION = "0.2.4.21-openssl1.0.1g";
|
public static final String BINARY_TOR_VERSION = "0.2.4.21-openssl1.0.1g-installfix";
|
||||||
public static final String BINARY_PRIVOXY_VERSION = "3.0.12";
|
public static final String BINARY_PRIVOXY_VERSION = "3.0.12";
|
||||||
public static final String PREF_BINARY_TOR_VERSION_INSTALLED = "BINARY_TOR_VERSION_INTALLED";
|
public static final String PREF_BINARY_TOR_VERSION_INSTALLED = "BINARY_TOR_VERSION_INTALLED";
|
||||||
public static final String PREF_BINARY_PRIVOXY_VERSION_INSTALLED = "BINARY_PRIVOXY_VERSION_INTALLED";
|
public static final String PREF_BINARY_PRIVOXY_VERSION_INSTALLED = "BINARY_PRIVOXY_VERSION_INTALLED";
|
||||||
|
|
|
@ -117,110 +117,4 @@ public class TorServiceUtils implements TorServiceConstants {
|
||||||
return procId;
|
return procId;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
public static int doShellCommand(String[] cmds, 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());
|
|
||||||
|
|
||||||
for (int i = 0; i < cmds.length; i++)
|
|
||||||
{
|
|
||||||
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");
|
|
||||||
}
|
|
||||||
|
|
||||||
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;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
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;
|
|
||||||
|
|
||||||
}
|
|
||||||
**/
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue