aboutsummaryrefslogtreecommitdiffstats
path: root/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/ProviderHelper.java
diff options
context:
space:
mode:
authorVincent Breitmoser <valodim@mugenguild.com>2014-10-26 00:26:13 +0200
committerVincent Breitmoser <valodim@mugenguild.com>2014-10-26 00:26:13 +0200
commit33738b1f520802124821faae12471c4019add17a (patch)
tree0b3955cec15186fd687d7eb0ebc5512e0fad257d /OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/ProviderHelper.java
parent74bac3ea36d89f4ee450782fdbb6da49b02ede2e (diff)
downloadopen-keychain-33738b1f520802124821faae12471c4019add17a.tar.gz
open-keychain-33738b1f520802124821faae12471c4019add17a.tar.bz2
open-keychain-33738b1f520802124821faae12471c4019add17a.zip
Retry canonicalization with pubkey self certs if first attempt failed
Fixes #974
Diffstat (limited to 'OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/ProviderHelper.java')
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/ProviderHelper.java20
1 files changed, 16 insertions, 4 deletions
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);
+ }
}
}