From 33738b1f520802124821faae12471c4019add17a Mon Sep 17 00:00:00 2001 From: Vincent Breitmoser Date: Sun, 26 Oct 2014 00:26:13 +0200 Subject: Retry canonicalization with pubkey self certs if first attempt failed Fixes #974 --- .../keychain/provider/ProviderHelper.java | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) (limited to 'OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/ProviderHelper.java') diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/ProviderHelper.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/ProviderHelper.java index c28ebde8d..46f294866 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/ProviderHelper.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/ProviderHelper.java @@ -135,9 +135,7 @@ public class ProviderHelper { } public void clearLog() { - if (mLog != null) { - mLog.clear(); - } + mLog = new OperationLog(); } // If we ever switch to api level 11, we can ditch this whole mess! @@ -867,7 +865,21 @@ public class ProviderHelper { // This is a safe cast, because we made sure this is a secret ring above canSecretRing = (CanonicalizedSecretKeyRing) secretRing.canonicalize(mLog, mIndent); if (canSecretRing == null) { - return new SaveKeyringResult(SaveKeyringResult.RESULT_ERROR, mLog, null); + + // Special case: If keyring canonicalization failed, try again after adding + // all self-certificates from the public key. + try { + log(LogType.MSG_IS_MERGE_SPECIAL); + UncachedKeyRing oldPublicRing = getCanonicalizedPublicKeyRing(masterKeyId).getUncachedKeyRing(); + secretRing = secretRing.merge(oldPublicRing, mLog, mIndent); + canSecretRing = (CanonicalizedSecretKeyRing) secretRing.canonicalize(mLog, mIndent); + } catch (NotFoundException e2) { + // nothing, this is handled right in the next line + } + + if (canSecretRing == null) { + return new SaveKeyringResult(SaveKeyringResult.RESULT_ERROR, mLog, null); + } } } -- cgit v1.2.3