Temporary fix for multi export

This commit is contained in:
Dominik Schürmann
2015-07-08 03:12:20 +02:00
parent 954825a42a
commit 15cee8e7e9
2 changed files with 31 additions and 24 deletions

View File

@@ -27,12 +27,14 @@ import java.io.FileOutputStream;
import java.io.IOException; import java.io.IOException;
import java.io.OutputStream; import java.io.OutputStream;
import java.net.Proxy; import java.net.Proxy;
import java.util.Collections;
import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicBoolean;
import android.content.Context; import android.content.Context;
import android.database.Cursor; import android.database.Cursor;
import android.net.Uri; import android.net.Uri;
import android.support.annotation.NonNull; import android.support.annotation.NonNull;
import android.text.TextUtils;
import org.spongycastle.bcpg.ArmoredOutputStream; import org.spongycastle.bcpg.ArmoredOutputStream;
import org.sufficientlysecure.keychain.Constants; import org.sufficientlysecure.keychain.Constants;
@@ -211,21 +213,21 @@ public class ExportOperation extends BaseOperation<ExportKeyringParcel> {
Cursor cursor = null; Cursor cursor = null;
try { try {
String selection = null, ids[] = null; String selection = null, selectionArgs[] = null;
if (masterKeyIds != null) { if (masterKeyIds != null) {
// generate placeholders and string selection args // convert long[] to String[]
ids = new String[masterKeyIds.length]; selectionArgs = new String[masterKeyIds.length];
StringBuilder placeholders = new StringBuilder("?");
for (int i = 0; i < masterKeyIds.length; i++) { for (int i = 0; i < masterKeyIds.length; i++) {
ids[i] = Long.toString(masterKeyIds[i]); selectionArgs[i] = Long.toString(masterKeyIds[i]);
if (i != 0) {
placeholders.append(",?");
}
} }
// generates ?,?,? as placeholders for selectionArgs
String placeholders = TextUtils.join(",",
Collections.nCopies(masterKeyIds.length, "?"));
// put together selection string // put together selection string
selection = Tables.KEY_RINGS_PUBLIC + "." + KeyRings.MASTER_KEY_ID selection = Tables.KEYS + "." + KeyRings.MASTER_KEY_ID
+ " IN (" + placeholders + ")"; + " IN (" + placeholders + ")";
} }
@@ -233,7 +235,7 @@ public class ExportOperation extends BaseOperation<ExportKeyringParcel> {
KeyRings.buildUnifiedKeyRingsUri(), new String[]{ KeyRings.buildUnifiedKeyRingsUri(), new String[]{
KeyRings.MASTER_KEY_ID, KeyRings.PUBKEY_DATA, KeyRings.MASTER_KEY_ID, KeyRings.PUBKEY_DATA,
KeyRings.PRIVKEY_DATA, KeyRings.HAS_ANY_SECRET KeyRings.PRIVKEY_DATA, KeyRings.HAS_ANY_SECRET
}, selection, ids, Tables.KEYS + "." + KeyRings.MASTER_KEY_ID }, selection, selectionArgs, Tables.KEYS + "." + KeyRings.MASTER_KEY_ID
); );
if (cursor == null || !cursor.moveToFirst()) { if (cursor == null || !cursor.moveToFirst()) {

View File

@@ -118,6 +118,7 @@ public class KeyListFragment extends LoaderFragment
// This ids for multiple key export. // This ids for multiple key export.
private ArrayList<Long> mIdsForRepeatAskPassphrase; private ArrayList<Long> mIdsForRepeatAskPassphrase;
private ArrayList<Long> mIdsForExport;
// This index for remembering the number of master key. // This index for remembering the number of master key.
private int mIndex; private int mIndex;
@@ -642,6 +643,7 @@ public class KeyListFragment extends LoaderFragment
private void showMultiExportDialog(long[] masterKeyIds) { private void showMultiExportDialog(long[] masterKeyIds) {
mIdsForRepeatAskPassphrase = new ArrayList<>(); mIdsForRepeatAskPassphrase = new ArrayList<>();
mIdsForExport = new ArrayList<>();
for (long id : masterKeyIds) { for (long id : masterKeyIds) {
try { try {
if (PassphraseCacheService.getCachedPassphrase( if (PassphraseCacheService.getCachedPassphrase(
@@ -651,6 +653,7 @@ public class KeyListFragment extends LoaderFragment
} catch (PassphraseCacheService.KeyNotFoundException e) { } catch (PassphraseCacheService.KeyNotFoundException e) {
// This happens when the master key is stripped // This happens when the master key is stripped
// and ignore this key. // and ignore this key.
mIdsForExport.add(id);
} }
} }
mIndex = 0; mIndex = 0;
@@ -658,13 +661,9 @@ public class KeyListFragment extends LoaderFragment
startPassphraseActivity(); startPassphraseActivity();
return; return;
} }
long[] idsForMultiExport = new long[mIdsForRepeatAskPassphrase.size()];
for (int i = 0; i < mIdsForRepeatAskPassphrase.size(); ++i) { mIdsForExport.addAll(mIdsForRepeatAskPassphrase);
idsForMultiExport[i] = mIdsForRepeatAskPassphrase.get(i); finishExport();
}
mExportHelper.showExportKeysDialog(idsForMultiExport,
Constants.Path.APP_DIR_FILE,
mAdapter.isAnySecretSelected());
} }
private void startPassphraseActivity() { private void startPassphraseActivity() {
@@ -674,6 +673,16 @@ public class KeyListFragment extends LoaderFragment
startActivityForResult(intent, REQUEST_REPEAT_PASSPHRASE); startActivityForResult(intent, REQUEST_REPEAT_PASSPHRASE);
} }
private void finishExport() {
long[] idsForMultiExport = new long[mIdsForExport.size()];
for (int i = 0; i < mIdsForExport.size(); i++) {
idsForMultiExport[i] = mIdsForExport.get(i);
}
mExportHelper.showExportKeysDialog(idsForMultiExport,
Constants.Path.APP_DIR_FILE,
mAdapter.isAnySecretSelected());
}
@Override @Override
public void onActivityResult(int requestCode, int resultCode, Intent data) { public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (mImportOpHelper != null) { if (mImportOpHelper != null) {
@@ -692,13 +701,9 @@ public class KeyListFragment extends LoaderFragment
startPassphraseActivity(); startPassphraseActivity();
return; return;
} }
long[] idsForMultiExport = new long[mIdsForRepeatAskPassphrase.size()];
for (int i = 0; i < mIdsForRepeatAskPassphrase.size(); ++i) { mIdsForExport.addAll(mIdsForRepeatAskPassphrase);
idsForMultiExport[i] = mIdsForRepeatAskPassphrase.get(i); finishExport();
}
mExportHelper.showExportKeysDialog(idsForMultiExport,
Constants.Path.APP_DIR_FILE,
mAdapter.isAnySecretSelected());
} }
if (requestCode == REQUEST_ACTION) { if (requestCode == REQUEST_ACTION) {