diff options
Diffstat (limited to 'OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/DeleteKeyDialogFragment.java')
-rw-r--r-- | OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/DeleteKeyDialogFragment.java | 99 |
1 files changed, 80 insertions, 19 deletions
diff --git a/OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/DeleteKeyDialogFragment.java b/OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/DeleteKeyDialogFragment.java index 109bfe929..3c44bff81 100644 --- a/OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/DeleteKeyDialogFragment.java +++ b/OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/DeleteKeyDialogFragment.java @@ -23,12 +23,16 @@ import org.sufficientlysecure.keychain.Constants; import org.sufficientlysecure.keychain.Id; import org.sufficientlysecure.keychain.R; import org.sufficientlysecure.keychain.pgp.PgpKeyHelper; +import org.sufficientlysecure.keychain.provider.KeychainContract; +import org.sufficientlysecure.keychain.provider.KeychainDatabase; import org.sufficientlysecure.keychain.provider.ProviderHelper; import org.sufficientlysecure.keychain.util.Log; import android.app.AlertDialog; import android.app.Dialog; import android.content.DialogInterface; +import android.database.Cursor; +import android.net.Uri; import android.os.Bundle; import android.os.Message; import android.os.Messenger; @@ -36,6 +40,8 @@ import android.os.RemoteException; import android.support.v4.app.DialogFragment; import android.support.v4.app.FragmentActivity; +import java.util.ArrayList; + public class DeleteKeyDialogFragment extends DialogFragment { private static final String ARG_MESSENGER = "messenger"; private static final String ARG_DELETE_KEY_RING_ROW_IDS = "delete_file"; @@ -43,13 +49,15 @@ public class DeleteKeyDialogFragment extends DialogFragment { public static final int MESSAGE_OKAY = 1; + public static final String MESSAGE_NOT_DELETED = "not_deleted"; + private Messenger mMessenger; /** * Creates new instance of this delete file dialog fragment */ public static DeleteKeyDialogFragment newInstance(Messenger messenger, long[] keyRingRowIds, - int keyType) { + int keyType) { DeleteKeyDialogFragment frag = new DeleteKeyDialogFragment(); Bundle args = new Bundle(); @@ -77,20 +85,13 @@ public class DeleteKeyDialogFragment extends DialogFragment { builder.setTitle(R.string.warning); if (keyRingRowIds.length == 1) { - // TODO: better way to do this? - String userId = activity.getString(R.string.user_id_no_name); - + Uri dataUri; if (keyType == Id.type.public_key) { - PGPPublicKeyRing keyRing = ProviderHelper.getPGPPublicKeyRingByRowId(activity, - keyRingRowIds[0]); - userId = PgpKeyHelper.getMainUserIdSafe(activity, - PgpKeyHelper.getMasterKey(keyRing)); + dataUri = KeychainContract.KeyRings.buildPublicKeyRingsUri(String.valueOf(keyRingRowIds[0])); } else { - PGPSecretKeyRing keyRing = ProviderHelper.getPGPSecretKeyRingByRowId(activity, - keyRingRowIds[0]); - userId = PgpKeyHelper.getMainUserIdSafe(activity, - PgpKeyHelper.getMasterKey(keyRing)); + dataUri = KeychainContract.KeyRings.buildSecretKeyRingsUri(String.valueOf(keyRingRowIds[0])); } + String userId = ProviderHelper.getUserId(activity, dataUri); builder.setMessage(getString( keyType == Id.type.public_key ? R.string.key_deletion_confirmation @@ -104,9 +105,61 @@ public class DeleteKeyDialogFragment extends DialogFragment { @Override public void onClick(DialogInterface dialog, int id) { + ArrayList<String> notDeleted = new ArrayList<String>(); + if (keyType == Id.type.public_key) { - for (long keyRowId : keyRingRowIds) { - ProviderHelper.deletePublicKeyRing(activity, keyRowId); + Uri queryUri = KeychainContract.KeyRings.buildPublicKeyRingsUri(); + String[] projection = new String[]{ + KeychainContract.KeyRings._ID, // 0 + KeychainContract.KeyRings.MASTER_KEY_ID, // 1 + KeychainContract.UserIds.USER_ID // 2 + }; + + // make selection with all entries where _ID is one of the given row ids + String selection = KeychainDatabase.Tables.KEY_RINGS + "." + + KeychainContract.KeyRings._ID + " IN("; + String selectionIDs = ""; + for (int i = 0; i < keyRingRowIds.length; i++) { + selectionIDs += "'" + String.valueOf(keyRingRowIds[i]) + "'"; + if (i+1 < keyRingRowIds.length) + selectionIDs += ","; + } + selection += selectionIDs + ")"; + + Cursor cursor = activity.getContentResolver().query(queryUri, projection, + selection, null, null); + + long rowId; + long masterKeyId; + String userId; + try { + while (cursor != null && cursor.moveToNext()) { + rowId = cursor.getLong(0); + masterKeyId = cursor.getLong(1); + userId = cursor.getString(2); + + Log.d(Constants.TAG, "rowId: " + rowId + ", masterKeyId: " + masterKeyId + + ", userId: " + userId); + + // check if a corresponding secret key exists... + Cursor secretCursor = activity.getContentResolver().query( + KeychainContract.KeyRings.buildSecretKeyRingsByMasterKeyIdUri(String.valueOf(masterKeyId)), + null, null, null, null + ); + if (secretCursor != null && secretCursor.getCount() > 0) { + notDeleted.add(userId); + } else { + // it is okay to delete this key, no secret key found! + ProviderHelper.deletePublicKeyRing(activity, rowId); + } + if (secretCursor != null) { + secretCursor.close(); + } + } + } finally { + if (cursor != null) { + cursor.close(); + } } } else { for (long keyRowId : keyRingRowIds) { @@ -116,7 +169,13 @@ public class DeleteKeyDialogFragment extends DialogFragment { dismiss(); - sendMessageToHandler(MESSAGE_OKAY); + if (notDeleted.size() > 0) { + Bundle data = new Bundle(); + data.putStringArrayList(MESSAGE_NOT_DELETED, notDeleted); + sendMessageToHandler(MESSAGE_OKAY, data); + } else { + sendMessageToHandler(MESSAGE_OKAY, null); + } } }); builder.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() { @@ -131,13 +190,15 @@ public class DeleteKeyDialogFragment extends DialogFragment { /** * Send message back to handler which is initialized in a activity - * - * @param what - * Message integer you want to send + * + * @param what Message integer you want to send */ - private void sendMessageToHandler(Integer what) { + private void sendMessageToHandler(Integer what, Bundle data) { Message msg = Message.obtain(); msg.what = what; + if (data != null) { + msg.setData(data); + } try { mMessenger.send(msg); |