create zip backup from itent
This commit is contained in:
parent
9bb3e2a7b3
commit
5edfc344dc
|
@ -29,6 +29,7 @@ import org.torproject.android.ui.PromoAppsActivity;
|
||||||
import org.torproject.android.ui.Rotate3dAnimation;
|
import org.torproject.android.ui.Rotate3dAnimation;
|
||||||
import org.torproject.android.ui.hs.providers.HSContentProvider;
|
import org.torproject.android.ui.hs.providers.HSContentProvider;
|
||||||
import org.torproject.android.vpn.VPNEnableActivity;
|
import org.torproject.android.vpn.VPNEnableActivity;
|
||||||
|
import org.torproject.android.hsutils.HiddenServiceUtils;
|
||||||
|
|
||||||
import android.annotation.SuppressLint;
|
import android.annotation.SuppressLint;
|
||||||
import android.app.ActivityManager;
|
import android.app.ActivityManager;
|
||||||
|
@ -596,25 +597,23 @@ public class OrbotMainActivity extends AppCompatActivity
|
||||||
stopVpnService();
|
stopVpnService();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void enableHiddenServicePort (String hsName, int hsPort, int hsRemotePort) throws RemoteException, InterruptedException
|
private void enableHiddenServicePort (String hsName, final int hsPort, int hsRemotePort, final boolean doBackup) throws RemoteException, InterruptedException
|
||||||
{
|
{
|
||||||
String onionHostname = null;
|
String onionHostname = null;
|
||||||
|
|
||||||
final int mHsPort = hsPort;
|
|
||||||
|
|
||||||
if(hsName == null)
|
if(hsName == null)
|
||||||
hsName = "hs" + mHsPort;
|
hsName = "hs" + hsPort;
|
||||||
|
|
||||||
if(hsRemotePort == -1)
|
if(hsRemotePort == -1)
|
||||||
hsRemotePort = mHsPort;
|
hsRemotePort = hsPort;
|
||||||
|
|
||||||
ContentValues fields = new ContentValues();
|
ContentValues fields = new ContentValues();
|
||||||
fields.put("name", hsName);
|
fields.put("name", hsName);
|
||||||
fields.put("port", mHsPort);
|
fields.put("port", hsPort);
|
||||||
fields.put("onion_port", hsRemotePort);
|
fields.put("onion_port", hsRemotePort);
|
||||||
|
|
||||||
ContentResolver cr = getContentResolver();
|
ContentResolver cr = getContentResolver();
|
||||||
Cursor row = cr.query(HSContentProvider.CONTENT_URI, mProjection, "port=" + mHsPort, null, null);
|
Cursor row = cr.query(HSContentProvider.CONTENT_URI, mProjection, "port=" + hsPort, null, null);
|
||||||
|
|
||||||
if(row == null) {
|
if(row == null) {
|
||||||
cr.insert(HSContentProvider.CONTENT_URI, fields);
|
cr.insert(HSContentProvider.CONTENT_URI, fields);
|
||||||
|
@ -632,6 +631,7 @@ public class OrbotMainActivity extends AppCompatActivity
|
||||||
public void run ()
|
public void run ()
|
||||||
{
|
{
|
||||||
String hostname = null;
|
String hostname = null;
|
||||||
|
String backupPath = null;
|
||||||
|
|
||||||
while (hostname == null)
|
while (hostname == null)
|
||||||
{
|
{
|
||||||
|
@ -643,16 +643,22 @@ public class OrbotMainActivity extends AppCompatActivity
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
|
|
||||||
Cursor onion = getContentResolver().query(HSContentProvider.CONTENT_URI, mProjection, "port=" + mHsPort, null, null);
|
Cursor onion = getContentResolver().query(HSContentProvider.CONTENT_URI, mProjection, "port=" + hsPort, null, null);
|
||||||
if(onion != null) {
|
if(onion != null) {
|
||||||
hostname = onion.getString(onion.getColumnIndex(HSContentProvider.HiddenService.NAME));
|
hostname = onion.getString(onion.getColumnIndex(HSContentProvider.HiddenService.NAME));
|
||||||
|
if(doBackup) {
|
||||||
|
HiddenServiceUtils hsutils = new HiddenServiceUtils(getApplicationContext());
|
||||||
|
backupPath = hsutils.createOnionBackup(hsPort);
|
||||||
|
}
|
||||||
onion.close();
|
onion.close();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Intent nResult = new Intent();
|
Intent nResult = new Intent();
|
||||||
nResult.putExtra("hs_host", hostname);
|
nResult.putExtra("hs_host", hostname);
|
||||||
// TODO: Add key
|
if(doBackup && backupPath != null) {
|
||||||
|
nResult.putExtra("hs_backup_path", backupPath);
|
||||||
|
}
|
||||||
setResult(RESULT_OK, nResult);
|
setResult(RESULT_OK, nResult);
|
||||||
finish();
|
finish();
|
||||||
}
|
}
|
||||||
|
@ -685,9 +691,10 @@ public class OrbotMainActivity extends AppCompatActivity
|
||||||
|
|
||||||
if (action.equals(INTENT_ACTION_REQUEST_HIDDEN_SERVICE))
|
if (action.equals(INTENT_ACTION_REQUEST_HIDDEN_SERVICE))
|
||||||
{
|
{
|
||||||
final int hiddenServicePort = getIntent().getIntExtra("hs_port", -1);
|
final int hiddenServicePort = intent.getIntExtra("hs_port", -1);
|
||||||
final int hiddenServiceRemotePort = getIntent().getIntExtra("hs_onion_port", -1);
|
final int hiddenServiceRemotePort = intent.getIntExtra("hs_onion_port", -1);
|
||||||
final String hiddenServiceName = getIntent().getStringExtra("hs_name");
|
final String hiddenServiceName = intent.getStringExtra("hs_name");
|
||||||
|
final Boolean createBackup = intent.getBooleanExtra("hs_backup",false);
|
||||||
|
|
||||||
DialogInterface.OnClickListener dialogClickListener = new DialogInterface.OnClickListener() {
|
DialogInterface.OnClickListener dialogClickListener = new DialogInterface.OnClickListener() {
|
||||||
|
|
||||||
|
@ -697,7 +704,8 @@ public class OrbotMainActivity extends AppCompatActivity
|
||||||
|
|
||||||
try {
|
try {
|
||||||
enableHiddenServicePort (
|
enableHiddenServicePort (
|
||||||
hiddenServiceName, hiddenServicePort, hiddenServiceRemotePort
|
hiddenServiceName, hiddenServicePort,
|
||||||
|
hiddenServiceRemotePort, createBackup
|
||||||
);
|
);
|
||||||
} catch (RemoteException e) {
|
} catch (RemoteException e) {
|
||||||
// TODO Auto-generated catch block
|
// TODO Auto-generated catch block
|
||||||
|
|
|
@ -0,0 +1,42 @@
|
||||||
|
package org.torproject.android.hsutils;
|
||||||
|
|
||||||
|
import android.os.Environment;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
|
||||||
|
public class ExternalStorage {
|
||||||
|
private final String BACKUPS_DIR = "Orbot-HiddenServices";
|
||||||
|
|
||||||
|
public String createBackupDir() {
|
||||||
|
if (!isExternalStorageWritable()) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
File path = Environment.getExternalStoragePublicDirectory(BACKUPS_DIR);
|
||||||
|
|
||||||
|
if (!path.mkdirs()) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return path.getAbsolutePath();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Checks if external storage is available for read and write */
|
||||||
|
public boolean isExternalStorageWritable() {
|
||||||
|
String state = Environment.getExternalStorageState();
|
||||||
|
if (Environment.MEDIA_MOUNTED.equals(state)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Checks if external storage is available to at least read */
|
||||||
|
public boolean isExternalStorageReadable() {
|
||||||
|
String state = Environment.getExternalStorageState();
|
||||||
|
if (Environment.MEDIA_MOUNTED.equals(state) ||
|
||||||
|
Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,43 @@
|
||||||
|
package org.torproject.android.hsutils;
|
||||||
|
|
||||||
|
import android.app.Application;
|
||||||
|
import android.content.Context;
|
||||||
|
|
||||||
|
import org.torproject.android.service.TorServiceConstants;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
|
||||||
|
public class HiddenServiceUtils {
|
||||||
|
private static File appCacheHome;
|
||||||
|
|
||||||
|
public HiddenServiceUtils(Context context) {
|
||||||
|
appCacheHome = context.getDir(TorServiceConstants.DIRECTORY_TOR_DATA, Application.MODE_PRIVATE);
|
||||||
|
}
|
||||||
|
|
||||||
|
public String createOnionBackup(Integer port) {
|
||||||
|
|
||||||
|
ExternalStorage storage = new ExternalStorage();
|
||||||
|
String storage_path = storage.createBackupDir();
|
||||||
|
if (storage_path == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
String zip_path = storage_path + "/hs" + port + ".zip";
|
||||||
|
String files[] = {
|
||||||
|
appCacheHome + "/hs" + port + "/hostname",
|
||||||
|
appCacheHome + "/hs" + port + "/private_key"
|
||||||
|
};
|
||||||
|
|
||||||
|
ZipIt zip = new ZipIt(files, zip_path);
|
||||||
|
|
||||||
|
if (!zip.zip()) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return zip_path;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void restoreOnionBackup(String path) {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,50 @@
|
||||||
|
package org.torproject.android.hsutils;
|
||||||
|
|
||||||
|
|
||||||
|
import java.io.BufferedInputStream;
|
||||||
|
import java.io.BufferedOutputStream;
|
||||||
|
import java.io.FileInputStream;
|
||||||
|
import java.io.FileOutputStream;
|
||||||
|
import java.util.zip.ZipEntry;
|
||||||
|
import java.util.zip.ZipOutputStream;
|
||||||
|
|
||||||
|
public class ZipIt {
|
||||||
|
private static final int BUFFER = 2048;
|
||||||
|
|
||||||
|
private String[] _files;
|
||||||
|
private String _zipFile;
|
||||||
|
|
||||||
|
public ZipIt(String[] files, String zipFile) {
|
||||||
|
_files = files;
|
||||||
|
_zipFile = zipFile;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean zip() {
|
||||||
|
try {
|
||||||
|
BufferedInputStream origin = null;
|
||||||
|
FileOutputStream dest = new FileOutputStream(_zipFile);
|
||||||
|
|
||||||
|
ZipOutputStream out = new ZipOutputStream(new BufferedOutputStream(dest));
|
||||||
|
|
||||||
|
byte data[] = new byte[BUFFER];
|
||||||
|
|
||||||
|
for (String _file : _files) {
|
||||||
|
FileInputStream fi = new FileInputStream(_file);
|
||||||
|
origin = new BufferedInputStream(fi, BUFFER);
|
||||||
|
ZipEntry entry = new ZipEntry(_file.substring(_file.lastIndexOf("/") + 1));
|
||||||
|
out.putNextEntry(entry);
|
||||||
|
int count;
|
||||||
|
while ((count = origin.read(data, 0, BUFFER)) != -1) {
|
||||||
|
out.write(data, 0, count);
|
||||||
|
}
|
||||||
|
origin.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
out.close();
|
||||||
|
} catch (Exception e) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue