aboutsummaryrefslogtreecommitdiffstats
path: root/OpenKeychain
diff options
context:
space:
mode:
authorManoj Khanna <manojkhannakm@gmail.com>2015-03-18 17:53:24 +0530
committerManoj Khanna <manojkhannakm@gmail.com>2015-03-19 18:54:26 +0530
commitd122d27ebadbc883ba85e2256f1a0a29f791ee60 (patch)
tree10cd1ec8a1d20b17194b86e1dd34c50fec36ea2e /OpenKeychain
parent0bcc2793c334ad04d3f7fd9f401eb6ab485f8c39 (diff)
downloadopen-keychain-d122d27ebadbc883ba85e2256f1a0a29f791ee60.tar.gz
open-keychain-d122d27ebadbc883ba85e2256f1a0a29f791ee60.tar.bz2
open-keychain-d122d27ebadbc883ba85e2256f1a0a29f791ee60.zip
Fixed a crash on ViewKeyActivity
This occurs when deleting a key with a stripped master key from the ViewKeyActivity.
Diffstat (limited to 'OpenKeychain')
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyActivity.java91
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/ExportHelper.java15
2 files changed, 51 insertions, 55 deletions
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyActivity.java
index 13a5ac269..5834fa502 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyActivity.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyActivity.java
@@ -74,6 +74,8 @@ import org.sufficientlysecure.keychain.provider.ProviderHelper;
import org.sufficientlysecure.keychain.service.KeychainIntentService;
import org.sufficientlysecure.keychain.service.KeychainIntentServiceHandler;
import org.sufficientlysecure.keychain.service.KeychainIntentServiceHandler.MessageStatus;
+import org.sufficientlysecure.keychain.service.PassphraseCacheService;
+import org.sufficientlysecure.keychain.ui.dialog.DeleteKeyDialogFragment;
import org.sufficientlysecure.keychain.ui.util.FormattingUtils;
import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils;
import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils.State;
@@ -310,31 +312,31 @@ public class ViewKeyActivity extends BaseActivity implements
return true;
}
case R.id.menu_key_view_export_file: {
- Intent mIntent = new Intent(this,PassphraseDialogActivity.class);
- long keyId=0;
try {
- keyId = new ProviderHelper(this)
- .getCachedPublicKeyRing(mDataUri)
- .extractOrGetMasterKeyId();
- } catch (PgpKeyNotFoundException e) {
- e.printStackTrace();
+ if (PassphraseCacheService.getCachedPassphrase(this, mMasterKeyId, mMasterKeyId) != null) {
+ exportToFile(mDataUri, mExportHelper, mProviderHelper);
+ return true;
+ }
+
+ startPassphraseActivity(REQUEST_EXPORT);
+ } catch (PassphraseCacheService.KeyNotFoundException e) {
+ // This happens when the master key is stripped
+ exportToFile(mDataUri, mExportHelper, mProviderHelper);
}
- mIntent.putExtra(PassphraseDialogActivity.EXTRA_SUBKEY_ID,keyId);
- startActivityForResult(mIntent,REQUEST_EXPORT);
return true;
}
case R.id.menu_key_view_delete: {
- Intent mIntent = new Intent(this,PassphraseDialogActivity.class);
- long keyId=0;
try {
- keyId = new ProviderHelper(this)
- .getCachedPublicKeyRing(mDataUri)
- .extractOrGetMasterKeyId();
- } catch (PgpKeyNotFoundException e) {
- e.printStackTrace();
+ if (PassphraseCacheService.getCachedPassphrase(this, mMasterKeyId, mMasterKeyId) != null) {
+ deleteKey();
+ return true;
+ }
+
+ startPassphraseActivity(REQUEST_DELETE);
+ } catch (PassphraseCacheService.KeyNotFoundException e) {
+ // This happens when the master key is stripped
+ deleteKey();
}
- mIntent.putExtra(PassphraseDialogActivity.EXTRA_SUBKEY_ID,keyId);
- startActivityForResult(mIntent,REQUEST_DELETE);
return true;
}
case R.id.menu_key_view_advanced: {
@@ -473,22 +475,32 @@ public class ViewKeyActivity extends BaseActivity implements
ActivityCompat.startActivity(this, qrCodeIntent, opts);
}
- private void exportToFile(Uri dataUri, ExportHelper exportHelper, ProviderHelper providerHelper)
- throws ProviderHelper.NotFoundException {
- Uri baseUri = KeychainContract.KeyRings.buildUnifiedKeyRingUri(dataUri);
-
- HashMap<String, Object> data = providerHelper.getGenericData(
- baseUri,
- new String[]{KeychainContract.Keys.MASTER_KEY_ID, KeychainContract.KeyRings.HAS_SECRET},
- new int[]{ProviderHelper.FIELD_TYPE_INTEGER, ProviderHelper.FIELD_TYPE_INTEGER});
+ private void startPassphraseActivity(int requestCode) {
+ Intent intent = new Intent(this, PassphraseDialogActivity.class);
+ intent.putExtra(PassphraseDialogActivity.EXTRA_SUBKEY_ID, mMasterKeyId);
+ startActivityForResult(intent, requestCode);
+ }
- exportHelper.showExportKeysDialog(
- new long[]{(Long) data.get(KeychainContract.KeyRings.MASTER_KEY_ID)},
- Constants.Path.APP_DIR_FILE, ((Long) data.get(KeychainContract.KeyRings.HAS_SECRET) != 0)
- );
+ private void exportToFile(Uri dataUri, ExportHelper exportHelper, ProviderHelper providerHelper) {
+ try {
+ Uri baseUri = KeychainContract.KeyRings.buildUnifiedKeyRingUri(dataUri);
+
+ HashMap<String, Object> data = providerHelper.getGenericData(
+ baseUri,
+ new String[]{KeychainContract.Keys.MASTER_KEY_ID, KeychainContract.KeyRings.HAS_SECRET},
+ new int[]{ProviderHelper.FIELD_TYPE_INTEGER, ProviderHelper.FIELD_TYPE_INTEGER});
+
+ exportHelper.showExportKeysDialog(
+ new long[]{(Long) data.get(KeychainContract.KeyRings.MASTER_KEY_ID)},
+ Constants.Path.APP_DIR_FILE, ((Long) data.get(KeychainContract.KeyRings.HAS_SECRET) != 0)
+ );
+ } catch (ProviderHelper.NotFoundException e) {
+ Notify.showNotify(this, R.string.error_key_not_found, Notify.Style.ERROR);
+ Log.e(Constants.TAG, "Key not found", e);
+ }
}
- private void deleteKey(Uri dataUri, ExportHelper exportHelper) {
+ private void deleteKey() {
// Message is received after key is deleted
Handler returnHandler = new Handler() {
@Override
@@ -500,7 +512,11 @@ public class ViewKeyActivity extends BaseActivity implements
}
};
- exportHelper.deleteKey(dataUri, returnHandler);
+ // Create a new Messenger for the communication back
+ Messenger messenger = new Messenger(returnHandler);
+ DeleteKeyDialogFragment deleteKeyDialog = DeleteKeyDialogFragment.newInstance(messenger,
+ new long[]{ mMasterKeyId });
+ deleteKeyDialog.show(getSupportFragmentManager(), "deleteKeyDialog");
}
@Override
@@ -531,18 +547,13 @@ public class ViewKeyActivity extends BaseActivity implements
}
if (requestCode == REQUEST_DELETE && resultCode == Activity.RESULT_OK){
- deleteKey(mDataUri, mExportHelper);
+ deleteKey();
}
+
if (requestCode == REQUEST_EXPORT && resultCode == Activity.RESULT_OK){
- try {
- exportToFile(mDataUri, mExportHelper, mProviderHelper);
- } catch (ProviderHelper.NotFoundException e) {
- Notify.showNotify(this, R.string.error_key_not_found, Notify.Style.ERROR);
- Log.e(Constants.TAG, "Key not found", e);
- }
+ exportToFile(mDataUri, mExportHelper, mProviderHelper);
}
-
if (data != null && data.hasExtra(OperationResult.EXTRA_RESULT)) {
OperationResult result = data.getParcelableExtra(OperationResult.EXTRA_RESULT);
result.createNotify(this).show();
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/ExportHelper.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/ExportHelper.java
index cda5892fe..7b164f2b2 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/ExportHelper.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/ExportHelper.java
@@ -47,21 +47,6 @@ public class ExportHelper {
this.mActivity = activity;
}
- public void deleteKey(Uri dataUri, Handler deleteHandler) {
- try {
- long masterKeyId = new ProviderHelper(mActivity).getCachedPublicKeyRing(dataUri)
- .extractOrGetMasterKeyId();
-
- // Create a new Messenger for the communication back
- Messenger messenger = new Messenger(deleteHandler);
- DeleteKeyDialogFragment deleteKeyDialog = DeleteKeyDialogFragment.newInstance(messenger,
- new long[]{ masterKeyId });
- deleteKeyDialog.show(mActivity.getSupportFragmentManager(), "deleteKeyDialog");
- } catch (PgpKeyNotFoundException e) {
- Log.e(Constants.TAG, "key not found!", e);
- }
- }
-
/**
* Show dialog where to export keys
*/