Skip to content

Commit

Permalink
finishing touches (also use bundle keys in backup flows)
Browse files Browse the repository at this point in the history
  • Loading branch information
bitmold committed Sep 29, 2020
1 parent 1439356 commit 929407d
Show file tree
Hide file tree
Showing 7 changed files with 95 additions and 87 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,10 @@
import java.io.File;

public class ClientCookiesActivity extends AppCompatActivity {
public static final String BUNDLE_KEY_ID = "_id",
BUNDLE_KEY_DOMAIN = "domain",
BUNDLE_KEY_COOKIE = "auth_cookie_value",
BUNDLE_KEY_ENABLED = "enabled";
private static final int REQUEST_CODE_READ_COOKIE = 54;
private ContentResolver mResolver;
private ClientCookiesAdapter mAdapter;
Expand Down Expand Up @@ -65,11 +69,10 @@ protected void onCreate(Bundle savedInstanceState) {
Cursor item = (Cursor) parent.getItemAtPosition(position);

Bundle arguments = new Bundle();
arguments.putInt("_id", item.getInt(item.getColumnIndex(CookieContentProvider.ClientCookie._ID)));

arguments.putString("domain", item.getString(item.getColumnIndex(CookieContentProvider.ClientCookie.DOMAIN)));
arguments.putString("auth_cookie_value", item.getString(item.getColumnIndex(CookieContentProvider.ClientCookie.AUTH_COOKIE_VALUE)));
arguments.putInt("enabled", item.getInt(item.getColumnIndex(CookieContentProvider.ClientCookie.ENABLED)));
arguments.putInt(BUNDLE_KEY_ID, item.getInt(item.getColumnIndex(CookieContentProvider.ClientCookie._ID)));
arguments.putString(BUNDLE_KEY_DOMAIN, item.getString(item.getColumnIndex(CookieContentProvider.ClientCookie.DOMAIN)));
arguments.putString(BUNDLE_KEY_COOKIE, item.getString(item.getColumnIndex(CookieContentProvider.ClientCookie.AUTH_COOKIE_VALUE)));
arguments.putInt(BUNDLE_KEY_ENABLED, item.getInt(item.getColumnIndex(CookieContentProvider.ClientCookie.ENABLED)));

CookieActionsDialog dialog = new CookieActionsDialog();
dialog.setArguments(arguments);
Expand Down Expand Up @@ -138,39 +141,25 @@ private void restoreBackupLegacy() {
@Override
protected void onActivityResult(int request, int response, Intent data) {
super.onActivityResult(request, response, data);

if (request == REQUEST_CODE_READ_COOKIE) {
if (response != RESULT_OK) return;
if (request == REQUEST_CODE_READ_COOKIE && response == RESULT_OK) {
String cookieStr = DiskUtils.readFileFromInputStream(mResolver, data.getData());
new BackupUtils(this).restoreCookieBackup(cookieStr);
return;
}

IntentResult scanResult = IntentIntegrator.parseActivityResult(request, response, data);

if (scanResult == null) return;

String results = scanResult.getContents();

if (results == null || results.length() < 1) return;

try {
JSONObject savedValues = new JSONObject(results);
ContentValues fields = new ContentValues();

fields.put(
CookieContentProvider.ClientCookie.DOMAIN,
savedValues.getString(CookieContentProvider.ClientCookie.DOMAIN));

fields.put(
CookieContentProvider.ClientCookie.AUTH_COOKIE_VALUE,
savedValues.getString(CookieContentProvider.ClientCookie.AUTH_COOKIE_VALUE));

mResolver.insert(CookieContentProvider.CONTENT_URI, fields);

} catch (JSONException e) {
e.printStackTrace();
Toast.makeText(this, R.string.error, Toast.LENGTH_LONG).show();
} else {
IntentResult scanResult = IntentIntegrator.parseActivityResult(request, response, data);
if (scanResult == null) return;

String results = scanResult.getContents();
if (results == null || results.length() < 1) return;
try {
JSONObject savedValues = new JSONObject(results);
ContentValues fields = new ContentValues();
fields.put(CookieContentProvider.ClientCookie.DOMAIN, savedValues.getString(CookieContentProvider.ClientCookie.DOMAIN));
fields.put(CookieContentProvider.ClientCookie.AUTH_COOKIE_VALUE, savedValues.getString(CookieContentProvider.ClientCookie.AUTH_COOKIE_VALUE));
mResolver.insert(CookieContentProvider.CONTENT_URI, fields);
} catch (JSONException e) {
e.printStackTrace();
Toast.makeText(this, R.string.error, Toast.LENGTH_LONG).show();
}
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,11 @@
import java.io.File;

public class HiddenServicesActivity extends AppCompatActivity {
public static final String BUNDLE_KEY_ID = "_id",
BUNDLE_KEY_PORT = "port",
BUNDLE_KEY_ONION = "onion",
BUNDLE_KEY_AUTH_COOKIE = "auth_cookie",
BUNDLE_KEY_AUTH_COOKIE_VALUE = "auth_cookie_value";
private static final int REQUEST_CODE_READ_ZIP_BACKUP = 125;
private static final String BUNDLE_KEY_SHOW_USER_SERVICES = "show_user_services";
private ContentResolver mResolver;
Expand Down Expand Up @@ -75,11 +80,11 @@ protected void onCreate(Bundle savedInstanceState) {
Cursor item = (Cursor) parent.getItemAtPosition(position);

Bundle arguments = new Bundle();
arguments.putInt("_id", item.getInt(item.getColumnIndex(HSContentProvider.HiddenService._ID)));
arguments.putString("port", item.getString(item.getColumnIndex(HSContentProvider.HiddenService.PORT)));
arguments.putString("onion", item.getString(item.getColumnIndex(HSContentProvider.HiddenService.DOMAIN)));
arguments.putInt("auth_cookie", item.getInt(item.getColumnIndex(HSContentProvider.HiddenService.AUTH_COOKIE)));
arguments.putString("auth_cookie_value", item.getString(item.getColumnIndex(HSContentProvider.HiddenService.AUTH_COOKIE_VALUE)));
arguments.putInt(BUNDLE_KEY_ID, item.getInt(item.getColumnIndex(HSContentProvider.HiddenService._ID)));
arguments.putString(BUNDLE_KEY_PORT, item.getString(item.getColumnIndex(HSContentProvider.HiddenService.PORT)));
arguments.putString(BUNDLE_KEY_ONION, item.getString(item.getColumnIndex(HSContentProvider.HiddenService.DOMAIN)));
arguments.putInt(BUNDLE_KEY_AUTH_COOKIE, item.getInt(item.getColumnIndex(HSContentProvider.HiddenService.AUTH_COOKIE)));
arguments.putString(BUNDLE_KEY_AUTH_COOKIE_VALUE, item.getString(item.getColumnIndex(HSContentProvider.HiddenService.AUTH_COOKIE_VALUE)));

HSActionsDialog dialog = new HSActionsDialog();
dialog.setArguments(arguments);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
import org.json.JSONObject;
import org.torproject.android.R;
import org.torproject.android.core.DiskUtils;
import org.torproject.android.ui.hiddenservices.ClientCookiesActivity;
import org.torproject.android.ui.hiddenservices.providers.CookieContentProvider;

import java.io.File;
Expand All @@ -33,27 +34,35 @@ public class CookieActionsDialog extends DialogFragment {
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
final Bundle arguments = getArguments();
domain = arguments.getString("domain");
cookie = arguments.getString("auth_cookie_value");
enabled = arguments.getInt("enabled");
domain = arguments.getString(ClientCookiesActivity.BUNDLE_KEY_DOMAIN);
cookie = arguments.getString(ClientCookiesActivity.BUNDLE_KEY_COOKIE);
enabled = arguments.getInt(ClientCookiesActivity.BUNDLE_KEY_ENABLED);

return new AlertDialog.Builder(getActivity())
AlertDialog ad = new AlertDialog.Builder(getActivity())
.setTitle(R.string.client_cookies)
.setItems(new CharSequence[]{
getString(R.string.backup_cookie),
getString(R.string.delete_cookie)
}, (dialog, which) -> {
if (which == 0) doBackup();
else doDelete(arguments);
})
}, null)
.setNegativeButton(android.R.string.cancel, (dialog, which) -> dialog.dismiss())
.create();

ad.getListView().setOnItemClickListener((parent, view, position, id) -> {
if (position == 0) doBackup();
else {
doDelete(arguments);
ad.dismiss();
}
});

return ad;
}

private void doDelete(Bundle arguments) {
CookieDeleteDialog dialog = new CookieDeleteDialog();
dialog.setArguments(arguments);
dialog.show(getFragmentManager(), "CookieDeleteDialog");
dismiss();
}

private void doBackup() {
Expand All @@ -62,6 +71,7 @@ private void doBackup() {
Intent createFile = DiskUtils.createWriteFileIntent(filename, "application/json");
startActivityForResult(createFile, REQUEST_CODE_WRITE_FILE);
} else { // API 16, 17, and 18
int msg = R.string.backup_saved_at_external_storage;
try {
File externalStorage = DiskUtils.getOrCreateLegacyBackupDir();
String backupFile = externalStorage.getAbsolutePath() + "/" + filename;
Expand All @@ -70,8 +80,10 @@ private void doBackup() {
writer.write(data);
writer.close();
} catch (JSONException | IOException e) {
Toast.makeText(getContext(), R.string.error, Toast.LENGTH_LONG).show();
msg = R.string.error;
}
Toast.makeText(getContext(), msg, Toast.LENGTH_LONG).show();
dismiss();
}
}

Expand All @@ -87,20 +99,20 @@ private String createBackupData() throws JSONException {
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == REQUEST_CODE_WRITE_FILE && resultCode == Activity.RESULT_OK) {
if (data != null) {
int msg = R.string.backup_saved_at_external_storage;
Uri file = data.getData();
try {
ParcelFileDescriptor pfd = getActivity().getContentResolver().openFileDescriptor(file, "w");
FileOutputStream fileOutputStream = new FileOutputStream(pfd.getFileDescriptor());
fileOutputStream.write(createBackupData().getBytes());
// Let the document provider know you're done by closing the stream.
fileOutputStream.close();
fileOutputStream.close(); // Let the document provider know you're done by closing the stream
pfd.close();
} catch (JSONException | IOException e) {
e.printStackTrace();
Toast.makeText(getContext(), R.string.error, Toast.LENGTH_LONG).show();
return;
msg = R.string.error;
}
Toast.makeText(getContext(), R.string.backup_saved_at_external_storage, Toast.LENGTH_LONG).show();
dismiss();
Toast.makeText(getContext(), msg, Toast.LENGTH_LONG).show();
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import androidx.fragment.app.DialogFragment;

import org.torproject.android.R;
import org.torproject.android.ui.hiddenservices.ClientCookiesActivity;
import org.torproject.android.ui.hiddenservices.providers.CookieContentProvider;

public class CookieDeleteDialog extends DialogFragment {
Expand All @@ -29,7 +30,7 @@ public Dialog onCreateDialog(Bundle savedInstanceState) {
private void doDelete(Bundle arguments, Context context) {
context.getContentResolver().delete( // delete from db
CookieContentProvider.CONTENT_URI,
CookieContentProvider.ClientCookie._ID + "=" + arguments.getInt("_id"),
CookieContentProvider.ClientCookie._ID + "=" + arguments.getInt(ClientCookiesActivity.BUNDLE_KEY_ID),
null
);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
import org.torproject.android.R;
import org.torproject.android.core.ClipboardUtils;
import org.torproject.android.core.DiskUtils;
import org.torproject.android.ui.hiddenservices.HiddenServicesActivity;
import org.torproject.android.ui.hiddenservices.backup.BackupUtils;

import java.io.File;
Expand All @@ -27,22 +28,27 @@ public class HSActionsDialog extends DialogFragment {
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
final Bundle arguments = getArguments();
port = Integer.parseInt(arguments.getString("port"));
return new AlertDialog.Builder(getActivity())
port = Integer.parseInt(arguments.getString(HiddenServicesActivity.BUNDLE_KEY_PORT));
AlertDialog ad = new AlertDialog.Builder(getActivity())
.setItems(new CharSequence[]{
getString(R.string.copy_address_to_clipboard),
getString(R.string.show_auth_cookie),
getString(R.string.backup_service),
getString(R.string.delete_service)},
(dialog, which) -> {
if (which == 0) doCopy(arguments, getContext());
else if (which == 1) doShowAuthCookie(arguments, getContext());
else if (which == 2) doBackup(arguments, getContext());
else if (which == 3) doDelete(arguments);
})
getString(R.string.copy_address_to_clipboard),
getString(R.string.show_auth_cookie),
getString(R.string.backup_service),
getString(R.string.delete_service)}, null)
.setNegativeButton(android.R.string.cancel, (dialog, which) -> dialog.dismiss())
.setTitle(R.string.hidden_services)
.create();

// done this way so we can startActivityForResult on backup without the dialog vanishing
ad.getListView().setOnItemClickListener((parent, view, position, id) -> {
if (position == 0) doCopy(arguments, getContext());
else if (position == 1) doShowAuthCookie(arguments, getContext());
else if (position == 2) doBackup(arguments, getContext());
else if (position == 3) doDelete(arguments);
if (position != 2) dismiss();
});

return ad;
}

private void doDelete(Bundle arguments) {
Expand All @@ -52,9 +58,9 @@ private void doDelete(Bundle arguments) {
}

private void doShowAuthCookie(Bundle arguments, Context context) {
String auth_cookie_value = arguments.getString("auth_cookie_value");
String auth_cookie_value = arguments.getString(HiddenServicesActivity.BUNDLE_KEY_AUTH_COOKIE_VALUE);

if (arguments.getInt("auth_cookie") == 1) {
if (arguments.getInt(HiddenServicesActivity.BUNDLE_KEY_AUTH_COOKIE) == 1) {
if (auth_cookie_value == null || auth_cookie_value.length() < 1) {
Toast.makeText(context, R.string.please_restart_Orbot_to_enable_the_changes, Toast.LENGTH_LONG).show();
} else {
Expand All @@ -68,16 +74,16 @@ private void doShowAuthCookie(Bundle arguments, Context context) {
}

private void doCopy(Bundle arguments, Context context) {
String onion = arguments.getString("onion");
String onion = arguments.getString(HiddenServicesActivity.BUNDLE_KEY_ONION);
if (onion == null)
Toast.makeText(context, R.string.please_restart_Orbot_to_enable_the_changes, Toast.LENGTH_LONG).show();
else
ClipboardUtils.copyToClipboard("onion", arguments.getString("onion"), getString(R.string.done), context);
ClipboardUtils.copyToClipboard("onion", onion, getString(R.string.done), context);
}

private void doBackup(Bundle arguments, Context context) {
String filename = "hs" + port + ".zip";
String onion = arguments.getString("onion");
String onion = arguments.getString(HiddenServicesActivity.BUNDLE_KEY_ONION);
if (onion == null) {
Toast.makeText(context, R.string.please_restart_Orbot_to_enable_the_changes, Toast.LENGTH_LONG).show();
return;
Expand All @@ -102,11 +108,8 @@ public void onActivityResult(int requestCode, int resultCode, Intent data) {
private void attemptToWriteBackup(Uri outputFile) {
BackupUtils backupUtils = new BackupUtils(getContext());
String backup = backupUtils.createZipBackup(port, outputFile);
if (backup != null) {
Toast.makeText(getContext(), R.string.backup_saved_at_external_storage, Toast.LENGTH_LONG).show();
} else {
Toast.makeText(getContext(), R.string.error, Toast.LENGTH_LONG).show();
}
Toast.makeText(getContext(), backup != null ? R.string.backup_saved_at_external_storage : R.string.error, Toast.LENGTH_LONG).show();
dismiss();
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
import org.json.JSONObject;
import org.torproject.android.R;
import org.torproject.android.core.ClipboardUtils;
import org.torproject.android.ui.hiddenservices.HiddenServicesActivity;
import org.torproject.android.ui.hiddenservices.providers.CookieContentProvider;

public class HSCookieDialog extends DialogFragment {
Expand All @@ -22,8 +23,8 @@ public class HSCookieDialog extends DialogFragment {
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
final Bundle arguments = getArguments();
authCookieValue = arguments.getString("auth_cookie_value");
onion = arguments.getString("onion");
authCookieValue = arguments.getString(HiddenServicesActivity.BUNDLE_KEY_AUTH_COOKIE_VALUE);
onion = arguments.getString(HiddenServicesActivity.BUNDLE_KEY_ONION);
return new AlertDialog.Builder(getActivity())
.setTitle(authCookieValue)
.setItems(new CharSequence[]{
Expand All @@ -42,9 +43,7 @@ private void doShareQr() {
JSONObject backup = new JSONObject();
backup.put(CookieContentProvider.ClientCookie.DOMAIN, onion);
backup.put(CookieContentProvider.ClientCookie.AUTH_COOKIE_VALUE, authCookieValue);

new IntentIntegrator(getActivity()).shareText(backup.toString());

} catch (JSONException e) {
e.printStackTrace();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@

import org.torproject.android.R;
import org.torproject.android.service.TorServiceConstants;
import org.torproject.android.ui.hiddenservices.HiddenServicesActivity;
import org.torproject.android.ui.hiddenservices.providers.HSContentProvider;

import java.io.File;
Expand All @@ -29,14 +30,12 @@ public Dialog onCreateDialog(Bundle savedInstanceState) {
}

private void doDelete(Bundle arguments, Context context) {
context.getContentResolver().delete( // Delete from db
HSContentProvider.CONTENT_URI,
HSContentProvider.HiddenService._ID + "=" + arguments.getInt("_id"),
null);
context.getContentResolver().delete(HSContentProvider.CONTENT_URI,
HSContentProvider.HiddenService._ID + "=" + arguments.getInt(HiddenServicesActivity.BUNDLE_KEY_ID), null);

// Delete from internal storage
String base = context.getFilesDir().getAbsolutePath() + "/" + TorServiceConstants.HIDDEN_SERVICES_DIR;
File dir = new File(base, "hs" + arguments.getString("port"));
File dir = new File(base, "hs" + arguments.getString(HiddenServicesActivity.BUNDLE_KEY_PORT));

if (dir.isDirectory()) {
String[] children = dir.list();
Expand Down

0 comments on commit 929407d

Please sign in to comment.