From 0fd59bc78d22924ecc306899e6672332815f1cfe Mon Sep 17 00:00:00 2001 From: arrase Date: Sun, 20 Nov 2016 23:56:17 +0100 Subject: [PATCH] restore backup from intent --- .../torproject/android/OrbotMainActivity.java | 77 ++++++++++--------- .../android/hsutils/HiddenServiceUtils.java | 5 +- .../org/torproject/android/hsutils/ZipIt.java | 48 ++++++++++++ .../ui/hs/dialogs/HSActionsDialog.java | 3 +- 4 files changed, 92 insertions(+), 41 deletions(-) diff --git a/app/src/main/java/org/torproject/android/OrbotMainActivity.java b/app/src/main/java/org/torproject/android/OrbotMainActivity.java index 2e4a4e9d..b28c3c43 100644 --- a/app/src/main/java/org/torproject/android/OrbotMainActivity.java +++ b/app/src/main/java/org/torproject/android/OrbotMainActivity.java @@ -525,15 +525,15 @@ public class OrbotMainActivity extends AppCompatActivity } else if (item.getItemId() == R.id.menu_hidden_services) { - if(usesRuntimePermissions()){ - postPermissionsAction = new GrantedPermissionsAction() { - @Override - public void run(Context context, boolean granted) { - startActivity(new Intent(context, HiddenServicesActivity.class)); - } - }; + if(usesRuntimePermissions() && !hasPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE)){ + postPermissionsAction = new GrantedPermissionsAction() { + @Override + public void run(Context context, boolean granted) { + startActivity(new Intent(context, HiddenServicesActivity.class)); + } + }; - checkPermissions(); + checkPermissions(); } else { startActivity(new Intent(this, HiddenServicesActivity.class)); } @@ -615,7 +615,7 @@ public class OrbotMainActivity extends AppCompatActivity stopVpnService(); } - private void enableHiddenServicePort (String hsName, final int hsPort, int hsRemotePort, final boolean doBackup) throws RemoteException, InterruptedException + private void enableHiddenServicePort (String hsName, final int hsPort, int hsRemotePort, final boolean doBackup, final String keyZipPath) throws RemoteException, InterruptedException { String onionHostname = null; @@ -664,8 +664,15 @@ public class OrbotMainActivity extends AppCompatActivity Cursor onion = getContentResolver().query(HSContentProvider.CONTENT_URI, mProjection, "port=" + hsPort, null, null); if(onion != null) { hostname = onion.getString(onion.getColumnIndex(HSContentProvider.HiddenService.NAME)); - if(doBackup) { - HiddenServiceUtils hsutils = new HiddenServiceUtils(getApplicationContext()); + HiddenServiceUtils hsutils = new HiddenServiceUtils(getApplicationContext()); + if(keyZipPath != null && keyZipPath.length() > 0) + { + hsutils.restoreOnionBackup(hsPort, keyZipPath); + requestTorRereadConfig(); + } + + if(doBackup) + { backupPath = hsutils.createOnionBackup(hsPort); } onion.close(); @@ -686,7 +693,6 @@ public class OrbotMainActivity extends AppCompatActivity Intent nResult = new Intent(); nResult.putExtra("hs_host", onionHostname); - // TODO: Add key setResult(RESULT_OK, nResult); finish(); @@ -713,23 +719,22 @@ public class OrbotMainActivity extends AppCompatActivity final int hiddenServiceRemotePort = intent.getIntExtra("hs_onion_port", -1); final String hiddenServiceName = intent.getStringExtra("hs_name"); final Boolean createBackup = intent.getBooleanExtra("hs_backup",false); - - if(createBackup && usesRuntimePermissions()) - checkPermissions(); + final String keyZipPath = intent.getStringExtra("hs_key_zip_path"); DialogInterface.OnClickListener dialogClickListener = new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { switch (which){ case DialogInterface.BUTTON_POSITIVE: - if(createBackup && usesRuntimePermissions()){ + if(createBackup && usesRuntimePermissions() + && !hasPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE)){ postPermissionsAction = new GrantedPermissionsAction() { @Override public void run(Context context, boolean granted) { try { enableHiddenServicePort ( hiddenServiceName, hiddenServicePort, - hiddenServiceRemotePort, createBackup + hiddenServiceRemotePort, createBackup, keyZipPath ); } catch (RemoteException e) { // TODO Auto-generated catch block @@ -745,7 +750,7 @@ public class OrbotMainActivity extends AppCompatActivity try { enableHiddenServicePort ( hiddenServiceName, hiddenServicePort, - hiddenServiceRemotePort, createBackup + hiddenServiceRemotePort, createBackup, keyZipPath ); } catch (RemoteException e) { // TODO Auto-generated catch block @@ -1605,25 +1610,23 @@ public class OrbotMainActivity extends AppCompatActivity } private void checkPermissions() { - if (!hasPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE)) { - if (ActivityCompat.shouldShowRequestPermissionRationale - (OrbotMainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE)) { - Snackbar.make(findViewById(android.R.id.content), - R.string.please_grant_permissions_for_external_storage, - Snackbar.LENGTH_INDEFINITE).setAction("ENABLE", - new View.OnClickListener() { - @Override - public void onClick(View v) { - ActivityCompat.requestPermissions(OrbotMainActivity.this, - new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, - PERMISSIONS_REQUEST_WRITE_EXTERNAL_STORAGE); - } - }).show(); - } else { - ActivityCompat.requestPermissions(OrbotMainActivity.this, - new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, - PERMISSIONS_REQUEST_WRITE_EXTERNAL_STORAGE); - } + if (ActivityCompat.shouldShowRequestPermissionRationale + (OrbotMainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE)) { + Snackbar.make(findViewById(android.R.id.content), + R.string.please_grant_permissions_for_external_storage, + Snackbar.LENGTH_INDEFINITE).setAction("ENABLE", + new View.OnClickListener() { + @Override + public void onClick(View v) { + ActivityCompat.requestPermissions(OrbotMainActivity.this, + new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, + PERMISSIONS_REQUEST_WRITE_EXTERNAL_STORAGE); + } + }).show(); + } else { + ActivityCompat.requestPermissions(OrbotMainActivity.this, + new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, + PERMISSIONS_REQUEST_WRITE_EXTERNAL_STORAGE); } } diff --git a/app/src/main/java/org/torproject/android/hsutils/HiddenServiceUtils.java b/app/src/main/java/org/torproject/android/hsutils/HiddenServiceUtils.java index 2eb434c9..0e967566 100644 --- a/app/src/main/java/org/torproject/android/hsutils/HiddenServiceUtils.java +++ b/app/src/main/java/org/torproject/android/hsutils/HiddenServiceUtils.java @@ -37,7 +37,8 @@ public class HiddenServiceUtils { return zip_path; } - public void restoreOnionBackup(String path) { - + public void restoreOnionBackup(Integer port, String path) { + ZipIt zip = new ZipIt(null, path); + zip.unzip(appCacheHome + "/hs" + port); } } diff --git a/app/src/main/java/org/torproject/android/hsutils/ZipIt.java b/app/src/main/java/org/torproject/android/hsutils/ZipIt.java index 39544ec4..25d74a50 100644 --- a/app/src/main/java/org/torproject/android/hsutils/ZipIt.java +++ b/app/src/main/java/org/torproject/android/hsutils/ZipIt.java @@ -3,9 +3,13 @@ package org.torproject.android.hsutils; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; +import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; import java.util.zip.ZipEntry; +import java.util.zip.ZipInputStream; import java.util.zip.ZipOutputStream; public class ZipIt { @@ -47,4 +51,48 @@ public class ZipIt { return true; } + + public boolean unzip(String output_path) { + InputStream is; + ZipInputStream zis; + + try { + String filename; + is = new FileInputStream(_zipFile); + zis = new ZipInputStream(new BufferedInputStream(is)); + ZipEntry ze; + byte[] buffer = new byte[1024]; + int count; + + while ((ze = zis.getNextEntry()) != null) { + // zapis do souboru + filename = ze.getName(); + + // Need to create directories if not exists, or + // it will generate an Exception... + if (ze.isDirectory()) { + File fmd = new File(output_path + filename); + fmd.mkdirs(); + continue; + } + + FileOutputStream fout = new FileOutputStream(output_path + filename); + + // cteni zipu a zapis + while ((count = zis.read(buffer)) != -1) { + fout.write(buffer, 0, count); + } + + fout.close(); + zis.closeEntry(); + } + + zis.close(); + } catch (IOException e) { + e.printStackTrace(); + return false; + } + + return true; + } } \ No newline at end of file diff --git a/app/src/main/java/org/torproject/android/ui/hs/dialogs/HSActionsDialog.java b/app/src/main/java/org/torproject/android/ui/hs/dialogs/HSActionsDialog.java index 8d6ad379..97361b7e 100644 --- a/app/src/main/java/org/torproject/android/ui/hs/dialogs/HSActionsDialog.java +++ b/app/src/main/java/org/torproject/android/ui/hs/dialogs/HSActionsDialog.java @@ -53,11 +53,10 @@ public class HSActionsDialog extends DialogFragment { Toast.makeText(mContext, R.string.done, Toast.LENGTH_LONG).show(); - Uri selectedUri = Uri.parse(backupPath); + Uri selectedUri = Uri.parse(backupPath.substring(0, backupPath.lastIndexOf("/"))); Intent intent = new Intent(Intent.ACTION_VIEW); intent.setDataAndType(selectedUri, "resource/folder"); - if (intent.resolveActivityInfo(mContext.getPackageManager(), 0) != null) { startActivity(intent); } else {