updated TorBinaryInstaller now just handles resources
This commit is contained in:
parent
f538930b7c
commit
cac2a28d50
|
@ -0,0 +1,226 @@
|
||||||
|
/* Copyright (c) 2009, Nathan Freitas, Orbot / The Guardian Project - http://openideals.com/guardian */
|
||||||
|
/* See LICENSE for licensing information */
|
||||||
|
|
||||||
|
package org.torproject.android.service;
|
||||||
|
|
||||||
|
import java.io.BufferedReader;
|
||||||
|
import java.io.DataInputStream;
|
||||||
|
import java.io.DataOutputStream;
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FileNotFoundException;
|
||||||
|
import java.io.FileOutputStream;
|
||||||
|
import java.io.FileReader;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.io.OutputStream;
|
||||||
|
import java.util.zip.ZipEntry;
|
||||||
|
import java.util.zip.ZipInputStream;
|
||||||
|
|
||||||
|
import org.torproject.android.R;
|
||||||
|
import org.torproject.android.TorConstants;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.util.Log;
|
||||||
|
|
||||||
|
public class TorResourceInstaller implements TorServiceConstants {
|
||||||
|
|
||||||
|
|
||||||
|
File installFolder;
|
||||||
|
Context context;
|
||||||
|
|
||||||
|
public TorResourceInstaller (Context context, File installFolder)
|
||||||
|
{
|
||||||
|
this.installFolder = installFolder;
|
||||||
|
|
||||||
|
this.context = context;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
/*
|
||||||
|
* Extract the Tor resources from the APK file using ZIP
|
||||||
|
*/
|
||||||
|
public boolean installResources () throws IOException, FileNotFoundException
|
||||||
|
{
|
||||||
|
|
||||||
|
InputStream is;
|
||||||
|
File outFile;
|
||||||
|
|
||||||
|
is = context.getResources().openRawResource(R.raw.torrc);
|
||||||
|
outFile = new File(installFolder, TORRC_ASSET_KEY);
|
||||||
|
streamToFile(is,outFile, false, false);
|
||||||
|
|
||||||
|
is = context.getResources().openRawResource(R.raw.torrctether);
|
||||||
|
outFile = new File(installFolder, TORRC_TETHER_KEY);
|
||||||
|
streamToFile(is, outFile, false, false);
|
||||||
|
|
||||||
|
is = context.getResources().openRawResource(R.raw.privoxy_config);
|
||||||
|
outFile = new File(installFolder, PRIVOXYCONFIG_ASSET_KEY);
|
||||||
|
streamToFile(is,outFile, false, false);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Extract the Tor binary from the APK file using ZIP
|
||||||
|
*/
|
||||||
|
|
||||||
|
public boolean installGeoIP () throws IOException, FileNotFoundException
|
||||||
|
{
|
||||||
|
|
||||||
|
InputStream is;
|
||||||
|
File outFile;
|
||||||
|
|
||||||
|
is = context.getResources().openRawResource(R.raw.geoip);
|
||||||
|
outFile = new File(installFolder, GEOIP_ASSET_KEY);
|
||||||
|
streamToFile(is, outFile, false, true);
|
||||||
|
|
||||||
|
is = context.getResources().openRawResource(R.raw.geoip6);
|
||||||
|
outFile = new File(installFolder, GEOIP6_ASSET_KEY);
|
||||||
|
streamToFile(is, outFile, false, true);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
private static void copyAssetFile(Context ctx, String asset, File file) throws IOException, InterruptedException
|
||||||
|
{
|
||||||
|
|
||||||
|
DataOutputStream out = new DataOutputStream(new FileOutputStream(file));
|
||||||
|
InputStream is = new GZIPInputStream(ctx.getAssets().open(asset));
|
||||||
|
|
||||||
|
byte buf[] = new byte[8172];
|
||||||
|
int len;
|
||||||
|
while ((len = is.read(buf)) > 0) {
|
||||||
|
out.write(buf, 0, len);
|
||||||
|
}
|
||||||
|
out.close();
|
||||||
|
is.close();
|
||||||
|
}*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Write the inputstream contents to the file
|
||||||
|
*/
|
||||||
|
private static boolean streamToFile(InputStream stm, File outFile, boolean append, boolean zip) throws IOException
|
||||||
|
|
||||||
|
{
|
||||||
|
byte[] buffer = new byte[FILE_WRITE_BUFFER_SIZE];
|
||||||
|
|
||||||
|
int bytecount;
|
||||||
|
|
||||||
|
|
||||||
|
OutputStream stmOut = new FileOutputStream(outFile, append);
|
||||||
|
ZipInputStream zis = null;
|
||||||
|
|
||||||
|
if (zip)
|
||||||
|
{
|
||||||
|
zis = new ZipInputStream(stm);
|
||||||
|
ZipEntry ze = zis.getNextEntry();
|
||||||
|
stm = zis;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
while ((bytecount = stm.read(buffer)) > 0)
|
||||||
|
{
|
||||||
|
|
||||||
|
stmOut.write(buffer, 0, bytecount);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
stmOut.close();
|
||||||
|
stm.close();
|
||||||
|
|
||||||
|
if (zis != null)
|
||||||
|
zis.close();
|
||||||
|
|
||||||
|
|
||||||
|
return true;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
//copy the file from inputstream to File output - alternative impl
|
||||||
|
public void copyFile (InputStream is, File outputFile)
|
||||||
|
{
|
||||||
|
|
||||||
|
try {
|
||||||
|
outputFile.createNewFile();
|
||||||
|
DataOutputStream out = new DataOutputStream(new FileOutputStream(outputFile));
|
||||||
|
DataInputStream in = new DataInputStream(is);
|
||||||
|
|
||||||
|
int b = -1;
|
||||||
|
byte[] data = new byte[1024];
|
||||||
|
|
||||||
|
while ((b = in.read(data)) != -1) {
|
||||||
|
out.write(data);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (b == -1); //rejoice
|
||||||
|
|
||||||
|
//
|
||||||
|
out.flush();
|
||||||
|
out.close();
|
||||||
|
in.close();
|
||||||
|
// chmod?
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
} catch (IOException ex) {
|
||||||
|
Log.e(TorConstants.TAG, "error copying binary", ex);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Copies a raw resource file, given its ID to the given location
|
||||||
|
* @param ctx context
|
||||||
|
* @param resid resource id
|
||||||
|
* @param file destination file
|
||||||
|
* @param mode file permissions (E.g.: "755")
|
||||||
|
* @throws IOException on error
|
||||||
|
* @throws InterruptedException when interrupted
|
||||||
|
*/
|
||||||
|
private static void copyRawFile(Context ctx, int resid, File file, String mode, boolean isZipd) throws IOException, InterruptedException
|
||||||
|
{
|
||||||
|
final String abspath = file.getAbsolutePath();
|
||||||
|
// Write the iptables binary
|
||||||
|
final FileOutputStream out = new FileOutputStream(file);
|
||||||
|
InputStream is = ctx.getResources().openRawResource(resid);
|
||||||
|
|
||||||
|
if (isZipd)
|
||||||
|
{
|
||||||
|
ZipInputStream zis = new ZipInputStream(is);
|
||||||
|
ZipEntry ze = zis.getNextEntry();
|
||||||
|
is = zis;
|
||||||
|
}
|
||||||
|
|
||||||
|
byte buf[] = new byte[1024];
|
||||||
|
int len;
|
||||||
|
while ((len = is.read(buf)) > 0) {
|
||||||
|
out.write(buf, 0, len);
|
||||||
|
}
|
||||||
|
out.close();
|
||||||
|
is.close();
|
||||||
|
// Change the permissions
|
||||||
|
Runtime.getRuntime().exec("chmod "+mode+" "+abspath).waitFor();
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Asserts that the binary files are installed in the bin directory.
|
||||||
|
* @param ctx context
|
||||||
|
* @param showErrors indicates if errors should be alerted
|
||||||
|
* @return false if the binary files could not be installed
|
||||||
|
*/
|
||||||
|
/*
|
||||||
|
public static boolean assertIpTablesBinaries(Context ctx, boolean showErrors) throws Exception {
|
||||||
|
boolean changed = false;
|
||||||
|
|
||||||
|
// Check iptables_g1
|
||||||
|
File file = new File(ctx.getDir("bin",0), "iptables");
|
||||||
|
copyRawFile(ctx, R.raw.iptables, file, CHMOD_EXEC, false);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}*/
|
||||||
|
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue