From 9af532880c728ccd343769078b008a9b31dc4ce1 Mon Sep 17 00:00:00 2001 From: Vincent Breitmoser Date: Fri, 11 Apr 2014 01:48:08 +0200 Subject: [PATCH] fix EditKeyActivity --- .../service/PassphraseCacheService.java | 40 ++++++------- .../keychain/ui/EditKeyActivity.java | 56 +++++++++---------- 2 files changed, 46 insertions(+), 50 deletions(-) diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/PassphraseCacheService.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/PassphraseCacheService.java index cbc71ce6a..66411ce0b 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/PassphraseCacheService.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/PassphraseCacheService.java @@ -200,6 +200,26 @@ public class PassphraseCacheService extends Service { return cachedPassphrase; } + public static boolean hasPassphrase(PGPSecretKeyRing secretKeyRing) throws PGPException { + PGPSecretKey secretKey = null; + boolean foundValidKey = false; + for (Iterator keys = secretKeyRing.getSecretKeys(); keys.hasNext(); ) { + secretKey = (PGPSecretKey) keys.next(); + if (!secretKey.isPrivateKeyEmpty()) { + foundValidKey = true; + break; + } + } + if(!foundValidKey) { + return false; + } + + PBESecretKeyDecryptor keyDecryptor = new JcePBESecretKeyDecryptorBuilder() + .setProvider("SC").build("".toCharArray()); + PGPPrivateKey testKey = secretKey.extractPrivateKey(keyDecryptor); + return testKey == null; + } + /** * Checks if key has a passphrase. * @@ -210,25 +230,7 @@ public class PassphraseCacheService extends Service { // check if the key has no passphrase try { PGPSecretKeyRing secRing = ProviderHelper.getPGPSecretKeyRing(context, secretKeyId); - PGPSecretKey secretKey = null; - boolean foundValidKey = false; - for (Iterator keys = secRing.getSecretKeys(); keys.hasNext(); ) { - secretKey = (PGPSecretKey) keys.next(); - if (!secretKey.isPrivateKeyEmpty()) { - foundValidKey = true; - break; - } - } - - if (!foundValidKey) { - return false; - } - PBESecretKeyDecryptor keyDecryptor = new JcePBESecretKeyDecryptorBuilder().setProvider( - "SC").build("".toCharArray()); - PGPPrivateKey testKey = secretKey.extractPrivateKey(keyDecryptor); - if (testKey != null) { - return false; - } + return hasPassphrase(secRing); } catch (PGPException e) { // silently catch } catch (ProviderHelper.NotFoundException e) { diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EditKeyActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EditKeyActivity.java index 84f0c41cf..a009410a6 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EditKeyActivity.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EditKeyActivity.java @@ -39,10 +39,12 @@ import android.widget.CheckBox; import android.widget.CompoundButton; import android.widget.CompoundButton.OnCheckedChangeListener; import android.widget.LinearLayout; +import android.widget.Toast; import com.beardedhen.androidbootstrap.BootstrapButton; import com.devspark.appmsg.AppMsg; +import org.spongycastle.openpgp.PGPException; import org.spongycastle.openpgp.PGPSecretKey; import org.spongycastle.openpgp.PGPSecretKeyRing; import org.sufficientlysecure.keychain.Constants; @@ -287,34 +289,16 @@ public class EditKeyActivity extends ActionBarActivity implements EditorListener Log.d(Constants.TAG, "uri: " + mDataUri); try { - // get master key id using row id - long masterKeyId = ProviderHelper.getMasterKeyId(this, mDataUri); - finallyEdit(masterKeyId); - } catch (ProviderHelper.NotFoundException e) { - Log.e(Constants.TAG, "key not found!", e); - } - } - } + Uri secretUri = KeychainContract.KeyRingData.buildSecretKeyRingUri(mDataUri); + mKeyRing = (PGPSecretKeyRing) ProviderHelper.getPGPKeyRing(this, secretUri); - @SuppressWarnings("unchecked") - private void finallyEdit(final long masterKeyId) { - if (masterKeyId != 0) { - PGPSecretKey masterKey = null; - try { - mKeyRing = ProviderHelper.getPGPSecretKeyRing(this, masterKeyId); - - masterKey = mKeyRing.getSecretKey(); + PGPSecretKey masterKey = mKeyRing.getSecretKey(); mMasterCanSign = PgpKeyHelper.isCertificationKey(mKeyRing.getSecretKey()); for (PGPSecretKey key : new IterableIterator(mKeyRing.getSecretKeys())) { mKeys.add(key); mKeysUsages.add(-1); // get usage when view is created } - } catch (ProviderHelper.NotFoundException e) { - Log.e(Constants.TAG, "Keyring not found with masterKeyId: " + masterKeyId); - AppMsg.makeText(this, R.string.error_no_secret_key_found, AppMsg.STYLE_ALERT).show(); - // TODO - } - if (masterKey != null) { + boolean isSet = false; for (String userId : new IterableIterator(masterKey.getUserIDs())) { Log.d(Constants.TAG, "Added userId " + userId); @@ -327,17 +311,27 @@ public class EditKeyActivity extends ActionBarActivity implements EditorListener } mUserIds.add(userId); } + + buildLayout(false); + + mCurrentPassphrase = ""; + mIsPassphraseSet = PassphraseCacheService.hasPassphrase(mKeyRing); + if (!mIsPassphraseSet) { + // check "no passphrase" checkbox and remove button + mNoPassphrase.setChecked(true); + mChangePassphrase.setVisibility(View.GONE); + } + + } catch (ProviderHelper.NotFoundException e) { + Log.e(Constants.TAG, "Keyring not found: " + e.getMessage(), e); + Toast.makeText(this, R.string.error_no_secret_key_found, Toast.LENGTH_SHORT).show(); + finish(); + } catch (PGPException e) { + Log.e(Constants.TAG, "Error extracting key: " + e.getMessage(), e); + Toast.makeText(this, R.string.error_no_secret_key_found, Toast.LENGTH_LONG).show(); + finish(); } - } - mCurrentPassphrase = ""; - buildLayout(false); - - mIsPassphraseSet = PassphraseCacheService.hasPassphrase(this, masterKeyId); - if (!mIsPassphraseSet) { - // check "no passphrase" checkbox and remove button - mNoPassphrase.setChecked(true); - mChangePassphrase.setVisibility(View.GONE); } }